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,93 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/boolean_parameter'
3
-
4
- RSpec.describe Reek::SmellDetectors::BooleanParameter do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- def alfa(bravo = true)
8
- end
9
- RUBY
10
-
11
- expect(src).to reek_of(:BooleanParameter,
12
- lines: [1],
13
- context: 'alfa',
14
- message: "has boolean parameter 'bravo'",
15
- source: 'string',
16
- parameter: 'bravo')
17
- end
18
-
19
- it 'does count all occurences' do
20
- src = <<-RUBY
21
- def alfa(bravo = true, charlie = true)
22
- end
23
- RUBY
24
-
25
- expect(src).
26
- to reek_of(:BooleanParameter, lines: [1], context: 'alfa', parameter: 'bravo').
27
- and reek_of(:BooleanParameter, lines: [1], context: 'alfa', parameter: 'charlie')
28
- end
29
-
30
- context 'when examining an instance method' do
31
- it 'reports a parameter defaulted to false' do
32
- src = 'def alfa(bravo = false) end'
33
- expect(src).to reek_of(:BooleanParameter)
34
- end
35
-
36
- it 'reports two parameters defaulted to booleans in a mixed parameter list' do
37
- src = 'def alfa(bravo, charlie = true, delta = false, &echo) end'
38
-
39
- expect(src).to reek_of(:BooleanParameter, parameter: 'charlie').
40
- and reek_of(:BooleanParameter, parameter: 'delta').
41
- and not_reek_of(:BooleanParameter, parameter: 'bravo').
42
- and not_reek_of(:BooleanParameter, parameter: 'echo')
43
- end
44
-
45
- it 'reports keyword parameters defaulted to booleans' do
46
- src = 'def alfa(bravo: true, charlie: false) end'
47
- expect(src).
48
- to reek_of(:BooleanParameter, parameter: 'bravo').
49
- and reek_of(:BooleanParameter, parameter: 'charlie')
50
- end
51
-
52
- it 'does not report regular parameters' do
53
- src = 'def alfa(bravo, charlie) end'
54
- expect(src).not_to reek_of(:BooleanParameter)
55
- end
56
-
57
- it 'does not report array decomposition parameters' do
58
- src = 'def alfa((bravo, charlie)) end'
59
- expect(src).not_to reek_of(:BooleanParameter)
60
- end
61
-
62
- it 'does not report keyword parameters with no default' do
63
- src = 'def alfa(bravo:, charlie:) end'
64
- expect(src).not_to reek_of(:BooleanParameter)
65
- end
66
-
67
- it 'does not report keyword parameters with non-boolean default' do
68
- src = 'def alfa(bravo: 42, charlie: "32") end'
69
- expect(src).not_to reek_of(:BooleanParameter)
70
- end
71
- end
72
-
73
- context 'when examining a singleton method' do
74
- it 'reports a parameter defaulted to true' do
75
- src = 'def self.alfa(bravo = true) end'
76
- expect(src).to reek_of(:BooleanParameter)
77
- end
78
-
79
- it 'reports a parameter defaulted to false' do
80
- src = 'def self.alfa(bravo = false) end'
81
- expect(src).to reek_of(:BooleanParameter)
82
- end
83
-
84
- it 'reports two parameters defaulted to booleans' do
85
- src = 'def self.alfa(bravo, charlie = true, delta = false, &echo) end'
86
-
87
- expect(src).to reek_of(:BooleanParameter, parameter: 'charlie').
88
- and reek_of(:BooleanParameter, parameter: 'delta').
89
- and not_reek_of(:BooleanParameter, parameter: 'bravo').
90
- and not_reek_of(:BooleanParameter, parameter: 'echo')
91
- end
92
- end
93
- end
@@ -1,106 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/class_variable'
3
-
4
- RSpec.describe Reek::SmellDetectors::ClassVariable do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa
8
- @@bravo = 5
9
- end
10
- RUBY
11
-
12
- expect(src).to reek_of(:ClassVariable,
13
- lines: [2],
14
- context: 'Alfa',
15
- message: "declares the class variable '@@bravo'",
16
- source: 'string',
17
- name: '@@bravo')
18
- end
19
-
20
- it 'does count all class variables' do
21
- src = <<-RUBY
22
- class Alfa
23
- @@bravo = 42
24
- @@charlie = 99
25
- end
26
- RUBY
27
-
28
- expect(src).
29
- to reek_of(:ClassVariable, name: '@@bravo').
30
- and reek_of(:ClassVariable, name: '@@charlie')
31
- end
32
-
33
- it 'does not report class instance variables' do
34
- src = <<-RUBY
35
- class Alfa
36
- @bravo = 42
37
- end
38
- RUBY
39
-
40
- expect(src).not_to reek_of(:ClassVariable)
41
- end
42
-
43
- context 'with no class variables' do
44
- it 'records nothing in the class' do
45
- src = <<-RUBY
46
- class Alfa
47
- def bravo; end
48
- end
49
- RUBY
50
-
51
- expect(src).not_to reek_of(:ClassVariable)
52
- end
53
-
54
- it 'records nothing in the module' do
55
- src = <<-RUBY
56
- module Alfa
57
- def bravo; end
58
- end
59
- RUBY
60
-
61
- expect(src).not_to reek_of(:ClassVariable)
62
- end
63
- end
64
-
65
- ['class', 'module'].each do |scope|
66
- context "when examining a #{scope}" do
67
- it 'reports a class variable set in a method' do
68
- src = <<-RUBY
69
- #{scope} Alfa
70
- def bravo
71
- @@charlie = {}
72
- end
73
- end
74
- RUBY
75
-
76
- expect(src).to reek_of(:ClassVariable, name: '@@charlie')
77
- end
78
-
79
- it 'reports a class variable used in a method' do
80
- src = <<-RUBY
81
- #{scope} Alfa
82
- def bravo
83
- puts @@charlie
84
- end
85
- end
86
- RUBY
87
-
88
- expect(src).to reek_of(:ClassVariable, name: '@@charlie')
89
- end
90
-
91
- it "reports a class variable set in the #{scope} body and used in a method" do
92
- src = <<-RUBY
93
- #{scope} Alfa
94
- @@bravo = 42
95
-
96
- def charlie
97
- puts @@bravo
98
- end
99
- end
100
- RUBY
101
-
102
- expect(src).to reek_of(:ClassVariable, name: '@@bravo')
103
- end
104
- end
105
- end
106
- end
@@ -1,300 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/control_parameter'
3
-
4
- RSpec.describe Reek::SmellDetectors::ControlParameter do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- def alfa(bravo)
8
- bravo ? true : false
9
- end
10
- RUBY
11
-
12
- expect(src).to reek_of(:ControlParameter,
13
- lines: [2],
14
- context: 'alfa',
15
- message: "is controlled by argument 'bravo'",
16
- source: 'string',
17
- argument: 'bravo')
18
- end
19
-
20
- it 'does count all occurences' do
21
- src = <<-RUBY
22
- def alfa(bravo, charlie)
23
- bravo ? true : false
24
- charlie ? true : false
25
- end
26
- RUBY
27
-
28
- expect(src).
29
- to reek_of(:ControlParameter, lines: [2], argument: 'bravo').
30
- and reek_of(:ControlParameter, lines: [3], argument: 'charlie')
31
- end
32
-
33
- it 'does count multiple occurences of the same parameter' do
34
- src = <<-RUBY
35
- def alfa(bravo, charlie)
36
- if bravo
37
- delta if charlie
38
- end
39
- if charlie
40
- delta if bravo
41
- end
42
- end
43
- RUBY
44
-
45
- expect(src).
46
- to reek_of(:ControlParameter, lines: [2, 6], argument: 'bravo').
47
- and reek_of(:ControlParameter, lines: [3, 5], argument: 'charlie')
48
- end
49
-
50
- context 'when a parameter is not used to determine code path' do
51
- it 'does not report a ternary check on an ivar' do
52
- src = 'def alfa(bravo) @charlie ? bravo : false end'
53
- expect(src).not_to reek_of(:ControlParameter)
54
- end
55
-
56
- it 'does not report a ternary check on a lvar' do
57
- src = 'def alfa(bravo) charlie = 27; charlie ? bravo : @delta end'
58
- expect(src).not_to reek_of(:ControlParameter)
59
- end
60
-
61
- it 'does not report when parameter is unused' do
62
- src = 'def alfa(bravo) charlie = 1 end'
63
- expect(src).not_to reek_of(:ControlParameter)
64
- end
65
-
66
- it 'does not report when parameter is used inside conditional' do
67
- src = 'def alfa(bravo) if true then puts bravo end end'
68
- expect(src).not_to reek_of(:ControlParameter)
69
- end
70
- end
71
-
72
- context 'when a parameter is only used to determine code path' do
73
- it 'reports a ternary check on a parameter' do
74
- src = 'def alfa(bravo); bravo ? true : false; end'
75
- expect(src).to reek_of(:ControlParameter)
76
- end
77
-
78
- it 'reports a couple inside a block' do
79
- src = 'def alfa(bravo); charlie.map { |delta| bravo ? delta : "#{delta}" }; end'
80
- expect(src).to reek_of(:ControlParameter)
81
- end
82
-
83
- it 'reports on an if statement modifier' do
84
- src = 'def alfa(bravo); charlie if bravo; end'
85
- expect(src).to reek_of(:ControlParameter)
86
- end
87
-
88
- it 'reports on an unless statement modifier' do
89
- src = 'def alfa(bravo); charlie unless bravo; end'
90
- expect(src).to reek_of(:ControlParameter)
91
- end
92
-
93
- it 'reports on if control expression' do
94
- src = 'def alfa(bravo); if bravo then charlie end; end'
95
- expect(src).to reek_of(:ControlParameter)
96
- end
97
-
98
- it 'reports on if control expression with &&' do
99
- src = 'def alfa(bravo); if bravo && true then charlie end; end'
100
- expect(src).to reek_of(:ControlParameter)
101
- end
102
-
103
- it 'reports on if control expression with `and`' do
104
- src = 'def alfa(bravo); if bravo and true then charlie end; end'
105
- expect(src).to reek_of(:ControlParameter)
106
- end
107
-
108
- it 'reports on if control expression with preceding &&' do
109
- src = 'def alfa(bravo); if true && bravo then charlie end; end'
110
- expect(src).to reek_of(:ControlParameter)
111
- end
112
-
113
- it 'reports on if control expression with ||' do
114
- src = 'def alfa(bravo); if bravo || true then charlie end; end'
115
- expect(src).to reek_of(:ControlParameter)
116
- end
117
-
118
- it 'reports on if control expression with or' do
119
- src = 'def alfa(bravo); if bravo or true then charlie end; end'
120
- expect(src).to reek_of(:ControlParameter)
121
- end
122
-
123
- it 'reports on if control expression with if' do
124
- src = 'def alfa(bravo); if (bravo if true) then charlie end; end'
125
- expect(src).to reek_of(:ControlParameter)
126
- end
127
-
128
- it 'reports on && notation' do
129
- src = 'def alfa(bravo); bravo && charlie; end'
130
- expect(src).to reek_of(:ControlParameter)
131
- end
132
-
133
- it 'reports on || notation' do
134
- src = 'def alfa(bravo); bravo || charlie; end'
135
- expect(src).to reek_of(:ControlParameter)
136
- end
137
-
138
- it 'reports on case statement' do
139
- src = <<-RUBY
140
- def alfa(bravo)
141
- case bravo
142
- when nil then nil
143
- else false
144
- end
145
- end
146
- RUBY
147
-
148
- expect(src).to reek_of(:ControlParameter)
149
- end
150
-
151
- it 'reports on nested if statements that are both using control parameters' do
152
- src = <<-RUBY
153
- def nested(bravo)
154
- if bravo
155
- charlie
156
- charlie if bravo
157
- end
158
- end
159
- RUBY
160
-
161
- expect(src).to reek_of(:ControlParameter)
162
- end
163
-
164
- it 'reports on nested suffix if statements where the inner if is a control parameter' do
165
- src = <<-RUBY
166
- def nested(bravo)
167
- if true
168
- charlie
169
- charlie if bravo
170
- end
171
- end
172
- RUBY
173
-
174
- expect(src).to reek_of(:ControlParameter)
175
- end
176
-
177
- it 'reports on nested full if statements where the inner if is a control parameter' do
178
- src = <<-RUBY
179
- def alfa(bravo)
180
- if true
181
- charlie
182
- else
183
- if bravo
184
- delta
185
- end
186
- end
187
- end
188
- RUBY
189
-
190
- expect(src).to reek_of(:ControlParameter)
191
- end
192
-
193
- it 'reports on elsif statements' do
194
- src = <<-RUBY
195
- def alfa(bravo)
196
- if true
197
- charlie
198
- elsif bravo
199
- delta
200
- end
201
- end
202
- RUBY
203
-
204
- expect(src).to reek_of(:ControlParameter)
205
- end
206
-
207
- it 'reports on explicit comparison in the condition' do
208
- src = 'def alfa(bravo); if bravo == charlie then charlie end; end'
209
- expect(src).to reek_of(:ControlParameter)
210
- end
211
-
212
- it 'reports on explicit negative comparison in the condition' do
213
- src = 'def alfa(bravo); if bravo != charlie then charlie end; end'
214
- expect(src).to reek_of(:ControlParameter)
215
- end
216
-
217
- it 'reports when the argument is compared to a regexp' do
218
- src = 'def alfa(bravo); if bravo =~ charlie then charlie end; end'
219
- expect(src).to reek_of(:ControlParameter)
220
- end
221
-
222
- it 'reports when the argument is reverse-compared to a regexp' do
223
- src = 'def alfa(bravo); if /charlie/ =~ bravo then charlie end; end'
224
- expect(src).to reek_of(:ControlParameter)
225
- end
226
-
227
- it 'reports when the argument is used in a complex regexp' do
228
- src = 'def alfa(bravo); if /charlie#{bravo}/ =~ delta then charlie end; end'
229
- expect(src).to reek_of(:ControlParameter)
230
- end
231
-
232
- it 'reports when the argument is a block parameter' do
233
- src = 'def bravo(&charlie); delta(charlie || proc {}); end'
234
- expect(src).to reek_of(:ControlParameter)
235
- end
236
- end
237
-
238
- context 'when a parameter is used besides determining code path' do
239
- it 'does not report on if conditional expression' do
240
- src = 'def alfa(bravo); if bravo then charlie(bravo); end end'
241
- expect(src).not_to reek_of(:ControlParameter)
242
- end
243
-
244
- it 'does not report on an if statement modifier' do
245
- src = 'def alfa(bravo); charlie(bravo) if bravo; end'
246
- expect(src).not_to reek_of(:ControlParameter)
247
- end
248
-
249
- it 'does not report on an unless statement modifier' do
250
- src = 'def alfa(bravo); charlie(bravo) unless bravo; end'
251
- expect(src).not_to reek_of(:ControlParameter)
252
- end
253
-
254
- it 'does not report on if control expression with &&' do
255
- src = 'def alfa(bravo) if bravo && true then puts bravo end end'
256
- expect(src).not_to reek_of(:ControlParameter)
257
- end
258
-
259
- it 'does not report on && notation' do
260
- src = 'def alfa(bravo); bravo && charlie(bravo); end'
261
- expect(src).not_to reek_of(:ControlParameter)
262
- end
263
-
264
- it 'does not report on || notation' do
265
- src = 'def alfa(bravo); bravo || charlie(bravo) end'
266
- expect(src).not_to reek_of(:ControlParameter)
267
- end
268
-
269
- it 'does not report when parameter is used outside conditional' do
270
- src = 'def alfa(bravo) puts bravo; if bravo then charlie end; end'
271
- expect(src).not_to reek_of(:ControlParameter)
272
- end
273
-
274
- it 'does not report when parameter is used as a method call argument in a condition' do
275
- src = 'def alfa(bravo); if charlie(bravo) then delta end; end'
276
- expect(src).not_to reek_of(:ControlParameter)
277
- end
278
-
279
- it 'does not report when parameter is used as a method call receiver in a condition' do
280
- src = 'def alfa(bravo); if bravo.charlie? then delta end; end'
281
- expect(src).not_to reek_of(:ControlParameter)
282
- end
283
-
284
- it 'does not report when used in body of control flow operator' do
285
- src = <<-RUBY
286
- def alfa(bravo)
287
- case bravo
288
- when :charlie
289
- puts 'charlie'
290
- else
291
- puts 'delta'
292
- end
293
- echo or foxtrot(bravo)
294
- end
295
- RUBY
296
-
297
- expect(src).not_to reek_of(:ControlParameter)
298
- end
299
- end
300
- end
@@ -1,134 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/data_clump'
3
-
4
- RSpec.describe Reek::SmellDetectors::DataClump do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa
8
- def bravo (echo, foxtrot); end
9
- def charlie(echo, foxtrot); end
10
- def delta (echo, foxtrot); end
11
- end
12
- RUBY
13
-
14
- expect(src).to reek_of(:DataClump,
15
- lines: [2, 3, 4],
16
- context: 'Alfa',
17
- message: "takes parameters ['echo', 'foxtrot'] to 3 methods",
18
- source: 'string',
19
- parameters: ['echo', 'foxtrot'],
20
- count: 3)
21
- end
22
-
23
- it 'does count all occurences' do
24
- src = <<-RUBY
25
- class Alfa
26
- def bravo (echo, foxtrot); end
27
- def charlie(echo, foxtrot); end
28
- def delta (echo, foxtrot); end
29
-
30
- def golf (juliett, kilo); end
31
- def hotel(juliett, kilo); end
32
- def india(juliett, kilo); end
33
- end
34
- RUBY
35
-
36
- expect(src).
37
- to reek_of(:DataClump, lines: [2, 3, 4], parameters: ['echo', 'foxtrot']).
38
- and reek_of(:DataClump, lines: [6, 7, 8], parameters: ['juliett', 'kilo'])
39
- end
40
-
41
- %w(class module).each do |scope|
42
- it "does not report parameter sets < 2 for #{scope}" do
43
- src = <<-RUBY
44
- #{scope} Alfa
45
- def bravo (echo); end
46
- def charlie(echo); end
47
- def delta (echo); end
48
- end
49
- RUBY
50
-
51
- expect(src).not_to reek_of(:DataClump)
52
- end
53
-
54
- it "does not report less than 3 methods for #{scope}" do
55
- src = <<-RUBY
56
- #{scope} Alfa
57
- def bravo (echo, foxtrot); end
58
- def charlie(echo, foxtrot); end
59
- end
60
- RUBY
61
-
62
- expect(src).not_to reek_of(:DataClump)
63
- end
64
-
65
- it 'does not care about the order of arguments' do
66
- src = <<-RUBY
67
- #{scope} Alfa
68
- def bravo (echo, foxtrot); end
69
- def charlie(foxtrot, echo); end # <- This is the swapped one!
70
- def delta (echo, foxtrot); end
71
- end
72
- RUBY
73
-
74
- expect(src).to reek_of(:DataClump,
75
- count: 3,
76
- parameters: ['echo', 'foxtrot'])
77
- end
78
-
79
- it 'reports arguments in alphabetical order even if they are never used that way' do
80
- src = <<-RUBY
81
- #{scope} Alfa
82
- def bravo (foxtrot, echo); end
83
- def charlie(foxtrot, echo); end
84
- def delta (foxtrot, echo); end
85
- end
86
- RUBY
87
-
88
- expect(src).to reek_of(:DataClump,
89
- count: 3,
90
- parameters: ['echo', 'foxtrot'])
91
- end
92
-
93
- it 'reports parameter sets that are > 2' do
94
- src = <<-RUBY
95
- #{scope} Alfa
96
- def bravo (echo, foxtrot, golf); end
97
- def charlie(echo, foxtrot, golf); end
98
- def delta (echo, foxtrot, golf); end
99
- end
100
- RUBY
101
-
102
- expect(src).to reek_of(:DataClump,
103
- count: 3,
104
- parameters: ['echo', 'foxtrot', 'golf'])
105
- end
106
-
107
- it 'detects clumps smaller than the total number of parameters' do
108
- src = <<-RUBY
109
- # Total number of parameters is 3 but the clump size is 2.
110
- #{scope} Alfa
111
- def bravo (echo, foxtrot, golf); end
112
- def charlie(echo, golf, foxtrot); end
113
- def delta (hotel, echo, foxtrot); end
114
- end
115
- RUBY
116
-
117
- expect(src).to reek_of(:DataClump,
118
- parameters: ['echo', 'foxtrot'])
119
- end
120
-
121
- it 'ignores anonymous parameters' do
122
- src = <<-RUBY
123
- #{scope} Alfa
124
- def bravo (echo, foxtrot, *); end
125
- def charlie(echo, foxtrot, *); end
126
- def delta (echo, foxtrot, *); end
127
- end
128
- RUBY
129
-
130
- expect(src).to reek_of(:DataClump,
131
- parameters: ['echo', 'foxtrot'])
132
- end
133
- end
134
- end