reek 6.0.2 → 6.5.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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ruby.yml +58 -0
  4. data/.gitignore +0 -1
  5. data/.rubocop.yml +7 -20
  6. data/.rubocop_todo.yml +6 -4
  7. data/.simplecov +2 -0
  8. data/CHANGELOG.md +114 -0
  9. data/CONTRIBUTING.md +10 -10
  10. data/Dockerfile +1 -1
  11. data/Gemfile +17 -24
  12. data/README.md +38 -40
  13. data/Rakefile +2 -0
  14. data/bin/code_climate_reek +56 -8
  15. data/docs/yard_plugin.rb +3 -1
  16. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  17. data/lib/reek/ast/node.rb +16 -10
  18. data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
  19. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  20. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  21. data/lib/reek/ast/sexp_extensions/send.rb +22 -7
  22. data/lib/reek/cli/command/todo_list_command.rb +3 -3
  23. data/lib/reek/cli/options.rb +8 -8
  24. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
  25. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
  26. data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
  27. data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
  28. data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
  29. data/lib/reek/code_comment.rb +25 -20
  30. data/lib/reek/configuration/app_configuration.rb +5 -5
  31. data/lib/reek/configuration/configuration_converter.rb +1 -1
  32. data/lib/reek/configuration/configuration_file_finder.rb +5 -4
  33. data/lib/reek/configuration/default_directive.rb +1 -1
  34. data/lib/reek/configuration/directory_directives.rb +1 -1
  35. data/lib/reek/configuration/excluded_paths.rb +3 -2
  36. data/lib/reek/configuration/schema.rb +177 -0
  37. data/lib/reek/configuration/schema_validator.rb +12 -13
  38. data/lib/reek/context/attribute_context.rb +1 -1
  39. data/lib/reek/context/code_context.rb +3 -3
  40. data/lib/reek/context/method_context.rb +1 -1
  41. data/lib/reek/context/module_context.rb +4 -0
  42. data/lib/reek/context/refinement_context.rb +16 -0
  43. data/lib/reek/context/send_context.rb +7 -1
  44. data/lib/reek/context_builder.rb +17 -3
  45. data/lib/reek/documentation_link.rb +3 -5
  46. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
  47. data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
  48. data/lib/reek/errors/encoding_error.rb +1 -1
  49. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
  50. data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
  51. data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
  52. data/lib/reek/errors/syntax_error.rb +1 -1
  53. data/lib/reek/rake/task.rb +5 -5
  54. data/lib/reek/report/github_report.rb +55 -0
  55. data/lib/reek/report/text_report.rb +1 -1
  56. data/lib/reek/report.rb +7 -5
  57. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  58. data/lib/reek/smell_detectors/class_variable.rb +2 -2
  59. data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
  60. data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +1 -1
  61. data/lib/reek/smell_detectors/data_clump.rb +1 -1
  62. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
  63. data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
  64. data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
  65. data/lib/reek/smell_detectors/uncommunicative_module_name.rb +1 -1
  66. data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
  67. data/lib/reek/smell_warning.rb +1 -1
  68. data/lib/reek/source/source_code.rb +11 -5
  69. data/lib/reek/source/source_locator.rb +1 -3
  70. data/lib/reek/spec/should_reek_of.rb +11 -9
  71. data/lib/reek/spec.rb +1 -1
  72. data/lib/reek/version.rb +2 -2
  73. data/reek.gemspec +33 -25
  74. metadata +41 -238
  75. data/.travis.yml +0 -40
  76. data/docs/API.md +0 -174
  77. data/docs/Attribute.md +0 -39
  78. data/docs/Basic-Smell-Options.md +0 -85
  79. data/docs/Boolean-Parameter.md +0 -54
  80. data/docs/Class-Variable.md +0 -40
  81. data/docs/Code-Smells.md +0 -39
  82. data/docs/Command-Line-Options.md +0 -119
  83. data/docs/Control-Couple.md +0 -26
  84. data/docs/Control-Parameter.md +0 -32
  85. data/docs/Data-Clump.md +0 -46
  86. data/docs/Duplicate-Method-Call.md +0 -264
  87. data/docs/Feature-Envy.md +0 -93
  88. data/docs/How-To-Write-New-Detectors.md +0 -132
  89. data/docs/How-reek-works-internally.md +0 -114
  90. data/docs/Instance-Variable-Assumption.md +0 -163
  91. data/docs/Irresponsible-Module.md +0 -47
  92. data/docs/Large-Class.md +0 -16
  93. data/docs/Long-Parameter-List.md +0 -39
  94. data/docs/Long-Yield-List.md +0 -37
  95. data/docs/Manual-Dispatch.md +0 -30
  96. data/docs/Missing-Safe-Method.md +0 -92
  97. data/docs/Module-Initialize.md +0 -62
  98. data/docs/Nested-Iterators.md +0 -59
  99. data/docs/Nil-Check.md +0 -47
  100. data/docs/RSpec-matchers.md +0 -129
  101. data/docs/Rake-Task.md +0 -66
  102. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  103. data/docs/Reek-Driven-Development.md +0 -46
  104. data/docs/Repeated-Conditional.md +0 -47
  105. data/docs/Simulated-Polymorphism.md +0 -16
  106. data/docs/Smell-Suppression.md +0 -96
  107. data/docs/Style-Guide.md +0 -19
  108. data/docs/Subclassed-From-Core-Class.md +0 -79
  109. data/docs/Too-Many-Constants.md +0 -37
  110. data/docs/Too-Many-Instance-Variables.md +0 -43
  111. data/docs/Too-Many-Methods.md +0 -56
  112. data/docs/Too-Many-Statements.md +0 -54
  113. data/docs/Uncommunicative-Method-Name.md +0 -94
  114. data/docs/Uncommunicative-Module-Name.md +0 -92
  115. data/docs/Uncommunicative-Name.md +0 -18
  116. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  117. data/docs/Uncommunicative-Variable-Name.md +0 -96
  118. data/docs/Unused-Parameters.md +0 -28
  119. data/docs/Unused-Private-Method.md +0 -101
  120. data/docs/Utility-Function.md +0 -56
  121. data/docs/Versioning-Policy.md +0 -7
  122. data/docs/YAML-Reports.md +0 -93
  123. data/docs/defaults.reek.yml +0 -129
  124. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  125. data/docs/templates/default/docstring/setup.rb +0 -37
  126. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  127. data/features/command_line_interface/basic_usage.feature +0 -15
  128. data/features/command_line_interface/options.feature +0 -123
  129. data/features/command_line_interface/show_progress.feature +0 -33
  130. data/features/command_line_interface/smell_selection.feature +0 -15
  131. data/features/command_line_interface/smells_count.feature +0 -38
  132. data/features/command_line_interface/stdin.feature +0 -65
  133. data/features/configuration_files/accept_setting.feature +0 -87
  134. data/features/configuration_files/directory_specific_directives.feature +0 -274
  135. data/features/configuration_files/exclude_directives.feature +0 -35
  136. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  137. data/features/configuration_files/masking_smells.feature +0 -94
  138. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  139. data/features/configuration_files/reject_setting.feature +0 -89
  140. data/features/configuration_files/schema_validation.feature +0 -59
  141. data/features/configuration_files/show_configuration_file.feature +0 -44
  142. data/features/configuration_files/unused_private_method.feature +0 -68
  143. data/features/configuration_loading.feature +0 -91
  144. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  145. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  146. data/features/locales.feature +0 -32
  147. data/features/programmatic_access.feature +0 -41
  148. data/features/rake_task/rake_task.feature +0 -138
  149. data/features/reports/codeclimate.feature +0 -59
  150. data/features/reports/json.feature +0 -59
  151. data/features/reports/reports.feature +0 -219
  152. data/features/reports/yaml.feature +0 -52
  153. data/features/rspec_matcher.feature +0 -41
  154. data/features/samples.feature +0 -305
  155. data/features/step_definitions/.rubocop.yml +0 -5
  156. data/features/step_definitions/reek_steps.rb +0 -102
  157. data/features/step_definitions/sample_file_steps.rb +0 -63
  158. data/features/support/env.rb +0 -33
  159. data/features/todo_list.feature +0 -108
  160. data/lib/reek/configuration/schema.yml +0 -210
  161. data/samples/checkstyle.xml +0 -7
  162. data/samples/clean_source/clean.rb +0 -6
  163. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  164. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  165. data/samples/configuration/corrupt.reek +0 -1
  166. data/samples/configuration/empty.reek +0 -0
  167. data/samples/configuration/full_configuration.reek +0 -13
  168. data/samples/configuration/full_mask.reek +0 -6
  169. data/samples/configuration/home/home.reek.yml +0 -4
  170. data/samples/configuration/partial_mask.reek +0 -4
  171. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  172. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  173. data/samples/configuration/with_excluded_paths.reek +0 -5
  174. data/samples/no_config_file/.keep +0 -0
  175. data/samples/paths.rb +0 -5
  176. data/samples/smelly_source/inline.rb +0 -704
  177. data/samples/smelly_source/optparse.rb +0 -1788
  178. data/samples/smelly_source/redcloth.rb +0 -1130
  179. data/samples/smelly_source/ruby.rb +0 -368
  180. data/samples/smelly_source/smelly.rb +0 -7
  181. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  182. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  183. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  184. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  185. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  186. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  187. data/samples/source_with_non_ruby_files/gibberish +0 -1
  188. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  189. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  190. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  191. data/spec/quality/documentation_spec.rb +0 -41
  192. data/spec/quality/reek_source_spec.rb +0 -11
  193. data/spec/reek/ast/node_spec.rb +0 -211
  194. data/spec/reek/ast/object_refs_spec.rb +0 -83
  195. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  196. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  197. data/spec/reek/cli/application_spec.rb +0 -168
  198. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  199. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  200. data/spec/reek/cli/options_spec.rb +0 -51
  201. data/spec/reek/cli/silencer_spec.rb +0 -28
  202. data/spec/reek/code_comment_spec.rb +0 -184
  203. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  204. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  205. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  206. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  207. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  208. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  209. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  210. data/spec/reek/context/code_context_spec.rb +0 -192
  211. data/spec/reek/context/ghost_context_spec.rb +0 -60
  212. data/spec/reek/context/method_context_spec.rb +0 -72
  213. data/spec/reek/context/module_context_spec.rb +0 -55
  214. data/spec/reek/context/root_context_spec.rb +0 -12
  215. data/spec/reek/context/statement_counter_spec.rb +0 -24
  216. data/spec/reek/context_builder_spec.rb +0 -457
  217. data/spec/reek/detector_repository_spec.rb +0 -22
  218. data/spec/reek/documentation_link_spec.rb +0 -20
  219. data/spec/reek/errors/base_error_spec.rb +0 -13
  220. data/spec/reek/examiner_spec.rb +0 -309
  221. data/spec/reek/logging_error_handler_spec.rb +0 -24
  222. data/spec/reek/rake/task_spec.rb +0 -56
  223. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  224. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  225. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  226. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  227. data/spec/reek/report/html_report_spec.rb +0 -19
  228. data/spec/reek/report/json_report_spec.rb +0 -58
  229. data/spec/reek/report/location_formatter_spec.rb +0 -32
  230. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  231. data/spec/reek/report/text_report_spec.rb +0 -89
  232. data/spec/reek/report/xml_report_spec.rb +0 -24
  233. data/spec/reek/report/yaml_report_spec.rb +0 -55
  234. data/spec/reek/report_spec.rb +0 -28
  235. data/spec/reek/smell_configuration_spec.rb +0 -56
  236. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  237. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  238. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  239. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  240. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  241. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  242. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  243. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  244. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  245. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  246. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  247. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  248. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  249. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  250. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  251. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  252. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  253. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  254. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  255. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  256. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  257. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  258. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  259. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  260. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  261. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  262. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  263. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  264. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  265. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  266. data/spec/reek/smell_warning_spec.rb +0 -137
  267. data/spec/reek/source/source_code_spec.rb +0 -79
  268. data/spec/reek/source/source_locator_spec.rb +0 -166
  269. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  270. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  271. data/spec/reek/spec/should_reek_spec.rb +0 -52
  272. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  273. data/spec/reek/tree_dresser_spec.rb +0 -46
  274. data/spec/spec_helper.rb +0 -110
  275. data/tasks/configuration.rake +0 -18
  276. data/tasks/console.rake +0 -5
  277. data/tasks/reek.rake +0 -6
  278. data/tasks/rubocop.rake +0 -11
  279. data/tasks/test.rake +0 -32
  280. /data/lib/reek/{report/code_climate.rb → code_climate.rb} +0 -0
@@ -1,144 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/too_many_constants'
3
-
4
- RSpec.describe Reek::SmellDetectors::TooManyConstants do
5
- let(:config) do
6
- { Reek::SmellDetectors::TooManyConstants::MAX_ALLOWED_CONSTANTS_KEY => 2 }
7
- end
8
-
9
- it 'reports the right values' do
10
- src = <<-RUBY
11
- class Alfa
12
- Bravo = Charlie = Delta = 1
13
- end
14
- RUBY
15
-
16
- expect(src).to reek_of(:TooManyConstants,
17
- lines: [1],
18
- context: 'Alfa',
19
- message: 'has 3 constants',
20
- source: 'string',
21
- count: 3).with_config(config)
22
- end
23
-
24
- it 'does not report for non-excessive constants' do
25
- src = <<-RUBY
26
- class Alfa
27
- Bravo = Charlie = 1
28
- end
29
- RUBY
30
-
31
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
32
- end
33
-
34
- it 'does not report when increasing default' do
35
- src = <<-RUBY
36
- # :reek:TooManyConstants { max_constants: 3 }
37
- class Alfa
38
- Bravo = Charlie = Delta = 1
39
- end
40
- RUBY
41
-
42
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
43
- end
44
-
45
- it 'does not report when disabled' do
46
- src = <<-RUBY
47
- # :reek:TooManyConstants { enabled: false }
48
- class Alfa
49
- Bravo = Charlie = Delta = 1
50
- end
51
- RUBY
52
-
53
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
54
- end
55
-
56
- it 'does not account class definition' do
57
- src = <<-RUBY
58
- class Alfa
59
- Bravo = Charlie = 1
60
- Delta = Class.new(StandardError)
61
- end
62
- RUBY
63
-
64
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
65
- end
66
-
67
- it 'does not account struct definition' do
68
- src = <<-RUBY
69
- class Alfa
70
- Bravo = Charlie = 1
71
- Delta = Struct.new
72
- end
73
- RUBY
74
-
75
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
76
- end
77
-
78
- it 'counts each constant only once' do
79
- src = <<-RUBY
80
- class Alfa
81
- Bravo = Charlie = 1
82
- end
83
-
84
- class Delta
85
- Echo = Foxtrot = 1
86
- end
87
-
88
- class Golf
89
- Hotel = India = 1
90
- end
91
- RUBY
92
-
93
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
94
- end
95
-
96
- it 'does not report outer module when inner module suppressed' do
97
- src = <<-RUBY
98
- module Alfa
99
- # ignore :reek:TooManyConstants
100
- module Bravo
101
- Charlie = Delta = Echo = 1
102
- end
103
- end
104
- RUBY
105
-
106
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
107
- end
108
-
109
- it 'counts each constant only once for each namespace' do
110
- src = <<-RUBY
111
- module Alfa
112
- Bravo = Charlie = 1
113
-
114
- class Delta
115
- Echo = 1
116
- end
117
- end
118
- RUBY
119
-
120
- expect(src).not_to reek_of(:TooManyConstants).with_config(config)
121
- end
122
-
123
- it 'reports for excessive constants inside a module' do
124
- src = <<-RUBY
125
- module Alfa
126
- Bravo = Charlie = Delta = 1
127
- end
128
- RUBY
129
-
130
- expect(src).to reek_of(:TooManyConstants, context: 'Alfa').with_config(config)
131
- end
132
-
133
- it 'reports the full class name' do
134
- src = <<-RUBY
135
- module Alfa
136
- class Bravo
137
- Charlie = Delta = Echo = 1
138
- end
139
- end
140
- RUBY
141
-
142
- expect(src).to reek_of(:TooManyConstants, context: 'Alfa::Bravo').with_config(config)
143
- end
144
- end
@@ -1,132 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/too_many_instance_variables'
3
-
4
- RSpec.describe Reek::SmellDetectors::TooManyInstanceVariables do
5
- let(:config) do
6
- { Reek::SmellDetectors::TooManyInstanceVariables::MAX_ALLOWED_IVARS_KEY => 2 }
7
- end
8
-
9
- it 'reports the right values' do
10
- src = <<-RUBY
11
- class Alfa
12
- def bravo
13
- @charlie = @delta = @echo = 1
14
- end
15
- end
16
- RUBY
17
-
18
- expect(src).to reek_of(:TooManyInstanceVariables,
19
- lines: [1],
20
- context: 'Alfa',
21
- message: 'has at least 3 instance variables',
22
- source: 'string',
23
- count: 3).with_config(config)
24
- end
25
-
26
- it 'does not report for non-excessive ivars' do
27
- src = <<-RUBY
28
- class Alfa
29
- def bravo
30
- @charlie = @delta = 1
31
- end
32
- end
33
- RUBY
34
-
35
- expect(src).not_to reek_of(:TooManyInstanceVariables).with_config(config)
36
- end
37
-
38
- it 'has a configurable maximum' do
39
- src = <<-RUBY
40
- # :reek:TooManyInstanceVariables { max_instance_variables: 3 }
41
- class Alfa
42
- def bravo
43
- @charlie = @delta = @echo = 1
44
- end
45
- end
46
- RUBY
47
-
48
- expect(src).not_to reek_of(:TooManyInstanceVariables).with_config(config)
49
- end
50
-
51
- it 'counts each ivar only once' do
52
- src = <<-RUBY
53
- class Alfa
54
- def bravo
55
- @charlie = @delta = 1
56
- @charlie = @delta = 1
57
- end
58
- end
59
- RUBY
60
-
61
- expect(src).not_to reek_of(:TooManyInstanceVariables).with_config(config)
62
- end
63
-
64
- it 'does not report memoized bravo' do
65
- src = <<-RUBY
66
- class Alfa
67
- def bravo
68
- @charlie = @delta = 1
69
- @echo ||= 1
70
- end
71
- end
72
- RUBY
73
-
74
- expect(src).not_to reek_of(:TooManyInstanceVariables).with_config(config)
75
- end
76
-
77
- it 'does not count ivars across inner classes' do
78
- src = <<-RUBY
79
- class Alfa
80
- class Bravo
81
- def charlie
82
- @delta = @echo = 1
83
- end
84
- end
85
-
86
- class Hotel
87
- def india
88
- @juliett = 1
89
- end
90
- end
91
- end
92
- RUBY
93
-
94
- expect(src).not_to reek_of(:TooManyInstanceVariables).with_config(config)
95
- end
96
-
97
- it 'does not count ivars across inner modules and classes' do
98
- src = <<-RUBY
99
- class Alfa
100
- class Bravo
101
- def charlie
102
- @delta = @echo = 1
103
- end
104
- end
105
-
106
- module Foxtrot
107
- def golf
108
- @hotel = 1
109
- end
110
- end
111
- end
112
- RUBY
113
-
114
- expect(src).not_to reek_of(:TooManyInstanceVariables).with_config(config)
115
- end
116
-
117
- it 'reports excessive ivars across different methods' do
118
- src = <<-RUBY
119
- class Alfa
120
- def bravo
121
- @charlie = @delta = 1
122
- end
123
-
124
- def golf
125
- @hotel = 1
126
- end
127
- end
128
- RUBY
129
-
130
- expect(src).to reek_of(:TooManyInstanceVariables).with_config(config)
131
- end
132
- end
@@ -1,54 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/too_many_methods'
3
-
4
- RSpec.describe Reek::SmellDetectors::TooManyMethods do
5
- let(:config) do
6
- { Reek::SmellDetectors::TooManyMethods::MAX_ALLOWED_METHODS_KEY => 3 }
7
- end
8
-
9
- it 'reports the right values' do
10
- src = <<-RUBY
11
- class Alfa
12
- def bravo; end
13
- def charlie; end
14
- def delta; end
15
- def echo; end
16
- end
17
- RUBY
18
-
19
- expect(src).to reek_of(:TooManyMethods,
20
- lines: [1],
21
- context: 'Alfa',
22
- message: 'has at least 4 methods',
23
- source: 'string',
24
- count: 4).with_config(config)
25
- end
26
-
27
- it 'does not report if we stay below max_methods' do
28
- src = <<-RUBY
29
- class Alfa
30
- def bravo; end
31
- def charlie; end
32
- def delta; end
33
- end
34
- RUBY
35
-
36
- expect(src).not_to reek_of(:TooManyMethods).with_config(config)
37
- end
38
-
39
- it 'stops at a nested module' do
40
- src = <<-RUBY
41
- class Alfa
42
- def bravo; end
43
- def charlie; end
44
-
45
- module Hidden
46
- def delta; end
47
- def echo; end
48
- end
49
- end
50
- RUBY
51
-
52
- expect(src).not_to reek_of(:TooManyMethods).with_config(config)
53
- end
54
- end
@@ -1,90 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/too_many_statements'
3
-
4
- RSpec.describe Reek::SmellDetectors::TooManyStatements do
5
- let(:config) do
6
- { Reek::SmellDetectors::TooManyStatements::MAX_ALLOWED_STATEMENTS_KEY => 2 }
7
- end
8
-
9
- it 'reports the right values' do
10
- src = <<-RUBY
11
- class Alfa
12
- def bravo
13
- charlie = 1
14
- delta = 2
15
- echo = 3
16
- end
17
- end
18
- RUBY
19
-
20
- expect(src).to reek_of(:TooManyStatements,
21
- lines: [2],
22
- context: 'Alfa#bravo',
23
- message: 'has approx 3 statements',
24
- source: 'string',
25
- count: 3).with_config(config)
26
- end
27
-
28
- it 'does count all occurences' do
29
- src = <<-RUBY
30
- class Alfa
31
- def bravo
32
- charlie = 1
33
- delta = 2
34
- echo = 3
35
- end
36
-
37
- def foxtrot
38
- golf = 1
39
- hotel = 2
40
- india = 3
41
- end
42
- end
43
- RUBY
44
-
45
- expect(src).
46
- to reek_of(:TooManyStatements, lines: [2], context: 'Alfa#bravo').with_config(config).
47
- and reek_of(:TooManyStatements, lines: [8], context: 'Alfa#foxtrot').with_config(config)
48
- end
49
-
50
- it 'does not report short methods' do
51
- src = <<-RUBY
52
- class Alfa
53
- def bravo
54
- charlie = 1
55
- delta = 2
56
- end
57
- end
58
- RUBY
59
-
60
- expect(src).not_to reek_of(:TooManyStatements).with_config(config)
61
- end
62
-
63
- it 'does not report initialize' do
64
- src = <<-RUBY
65
- class Alfa
66
- def initialize
67
- charlie = 1
68
- delta = 2
69
- echo = 3
70
- end
71
- end
72
- RUBY
73
-
74
- expect(src).not_to reek_of(:TooManyStatements).with_config(config)
75
- end
76
-
77
- it 'reports long inner block' do
78
- src = <<-RUBY
79
- def long
80
- self.each do |x|
81
- charlie = 1
82
- delta = 2
83
- echo = 3
84
- end
85
- end
86
- RUBY
87
-
88
- expect(src).to reek_of(:TooManyStatements).with_config(config)
89
- end
90
- end
@@ -1,78 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/uncommunicative_method_name'
3
-
4
- RSpec.describe Reek::SmellDetectors::UncommunicativeMethodName do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- def m; end
8
- RUBY
9
-
10
- expect(src).to reek_of(:UncommunicativeMethodName,
11
- lines: [1],
12
- context: 'm',
13
- message: "has the name 'm'",
14
- source: 'string',
15
- name: 'm')
16
- end
17
-
18
- describe 'default configuration' do
19
- it 'reports one-word names' do
20
- src = 'def a; end'
21
- expect(src).to reek_of(:UncommunicativeMethodName)
22
- end
23
-
24
- it 'reports names ending with a digit' do
25
- src = 'def xyz1; end'
26
- expect(src).to reek_of(:UncommunicativeMethodName)
27
- end
28
-
29
- it 'reports camelcased names' do
30
- src = 'def aBBa; end'
31
- expect(src).to reek_of(:UncommunicativeMethodName)
32
- end
33
-
34
- it 'does not report one-letter special characters' do
35
- ['+', '-', '/', '*'].each do |symbol|
36
- expect("def #{symbol}; end").not_to reek_of(:UncommunicativeMethodName)
37
- end
38
- end
39
- end
40
-
41
- describe '`accept` patterns' do
42
- let(:source) { 'def x; end' }
43
-
44
- it 'make smelly names pass' do
45
- pattern = /x/
46
- expect(source).not_to reek_of(:UncommunicativeMethodName).with_config('accept' => pattern)
47
- end
48
- end
49
-
50
- describe '`reject` patterns' do
51
- let(:source) { 'def alfa; end' }
52
-
53
- it 'reject smelly names' do
54
- patterns = [/alf/, /lfa/]
55
- patterns.each do |pattern|
56
- expect(source).to reek_of(:UncommunicativeMethodName).with_config('reject' => pattern)
57
- end
58
- end
59
- end
60
-
61
- describe '.default_config' do
62
- it 'merges in the default accept and reject patterns' do
63
- expected = {
64
- 'enabled' => true,
65
- 'exclude' => [],
66
- 'reject' => [/^[a-z]$/, /[0-9]$/, /[A-Z]/],
67
- 'accept' => []
68
- }
69
- expect(described_class.default_config).to eq(expected)
70
- end
71
- end
72
-
73
- describe '.contexts' do
74
- it 'is scoped to classes and modules' do
75
- expect(described_class.contexts).to eq([:def, :defs])
76
- end
77
- end
78
- end
@@ -1,78 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/uncommunicative_module_name'
3
-
4
- RSpec.describe Reek::SmellDetectors::UncommunicativeModuleName do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class K
8
- end
9
- RUBY
10
-
11
- expect(src).to reek_of(:UncommunicativeModuleName,
12
- lines: [1],
13
- context: 'K',
14
- message: "has the name 'K'",
15
- source: 'string',
16
- name: 'K')
17
- end
18
-
19
- describe 'default configuration' do
20
- ['class', 'module'].each do |type|
21
- it 'does not report one-word name' do
22
- expect("#{type} Alfa; end").not_to reek_of(:UncommunicativeModuleName)
23
- end
24
-
25
- it 'reports one-letter name' do
26
- expect("#{type} X; end").to reek_of(:UncommunicativeModuleName, name: 'X')
27
- end
28
-
29
- it 'reports name of the form "x2"' do
30
- expect("#{type} X2; end").to reek_of(:UncommunicativeModuleName, name: 'X2')
31
- end
32
-
33
- it 'reports long name ending in a number' do
34
- expect("#{type} Alfa2; end").to reek_of(:UncommunicativeModuleName, name: 'Alfa2')
35
- end
36
- end
37
- end
38
-
39
- describe '`accept` patterns' do
40
- let(:source) { 'class Alfa1; end' }
41
-
42
- it 'make smelly names pass ' do
43
- patterns = [/lfa1/, /Alfa1/]
44
- patterns.each do |pattern|
45
- expect(source).not_to reek_of(:UncommunicativeModuleName).with_config('accept' => pattern)
46
- end
47
- end
48
- end
49
-
50
- describe '`reject` patterns' do
51
- let(:source) { 'class Alfa; end' }
52
-
53
- it 'reject smelly names' do
54
- patterns = [/lfa/, /Alf/]
55
- patterns.each do |pattern|
56
- expect(source).to reek_of(:UncommunicativeModuleName).with_config('reject' => pattern)
57
- end
58
- end
59
- end
60
-
61
- describe '.default_config' do
62
- it 'merges in the default accept and reject patterns' do
63
- expected = {
64
- 'enabled' => true,
65
- 'exclude' => [],
66
- 'reject' => [/^.$/, /[0-9]$/],
67
- 'accept' => []
68
- }
69
- expect(described_class.default_config).to eq(expected)
70
- end
71
- end
72
-
73
- describe '.contexts' do
74
- it 'indicates that this smell is scoped to classes and modules' do
75
- expect(described_class.contexts).to eq([:module, :class])
76
- end
77
- end
78
- end