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,457 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/context_builder'
3
-
4
- RSpec.describe Reek::ContextBuilder do
5
- describe '#context_tree' do
6
- context 'with some simple example code' do
7
- let(:walker) do
8
- code = 'class Car; def drive; end; end'
9
- described_class.new(syntax_tree(code))
10
- end
11
- let(:context_tree) { walker.context_tree }
12
- let(:module_context) { context_tree.children.first }
13
- let(:method_context) { module_context.children.first }
14
-
15
- describe 'the starting node' do
16
- it 'is a root node' do
17
- expect(context_tree.type).to eq(:root)
18
- expect(context_tree).to be_a(Reek::Context::RootContext)
19
- end
20
-
21
- it 'has one module_context child' do
22
- aggregate_failures do
23
- expect(context_tree.children.count).to eq 1
24
- expect(module_context).to be_a(Reek::Context::ModuleContext)
25
- end
26
- end
27
- end
28
-
29
- describe 'the module node' do
30
- it 'has one method_context child' do
31
- aggregate_failures do
32
- expect(method_context).to be_a(Reek::Context::MethodContext)
33
- expect(module_context.children.size).to eq(1)
34
- end
35
- end
36
-
37
- it 'holds a reference to the parent context' do
38
- expect(method_context.parent).to eq(module_context)
39
- end
40
- end
41
- end
42
-
43
- it 'creates the proper context for all kinds of singleton methods' do
44
- src = <<-RUBY
45
- class Car
46
- def self.start; end
47
-
48
- class << self
49
- def drive; end
50
- end
51
- end
52
- RUBY
53
-
54
- syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
55
- context_tree = described_class.new(syntax_tree).context_tree
56
-
57
- class_node = context_tree.children.first
58
- start_method = class_node.children.first
59
- drive_method = class_node.children.last
60
-
61
- expect(start_method).to be_instance_of Reek::Context::SingletonMethodContext
62
- expect(drive_method).to be_instance_of Reek::Context::SingletonMethodContext
63
- end
64
-
65
- it 'returns something sensible for nested metaclasses' do
66
- src = <<-RUBY
67
- class Foo
68
- class << self
69
- class << self
70
- def bar; end
71
- end
72
- end
73
- end
74
- RUBY
75
-
76
- syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
77
- context_tree = described_class.new(syntax_tree).context_tree
78
-
79
- class_context = context_tree.children.first
80
- method_context = class_context.children.first
81
-
82
- expect(method_context).to be_instance_of Reek::Context::SingletonMethodContext
83
- expect(method_context.parent).to eq class_context
84
- end
85
-
86
- it 'returns something sensible for nested method definitions' do
87
- src = <<-RUBY
88
- class Foo
89
- def foo
90
- def bar
91
- end
92
- end
93
- end
94
- RUBY
95
-
96
- syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
97
- context_tree = described_class.new(syntax_tree).context_tree
98
-
99
- class_context = context_tree.children.first
100
- foo_context = class_context.children.first
101
-
102
- bar_context = foo_context.children.first
103
- expect(bar_context).to be_instance_of Reek::Context::MethodContext
104
- expect(bar_context.parent).to eq foo_context
105
- end
106
-
107
- it 'returns something sensible for method definitions nested in singleton methods' do
108
- src = <<-RUBY
109
- class Foo
110
- def self.foo
111
- def bar
112
- end
113
- end
114
- end
115
- RUBY
116
-
117
- syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
118
- context_tree = described_class.new(syntax_tree).context_tree
119
-
120
- class_context = context_tree.children.first
121
- foo_context = class_context.children.first
122
-
123
- bar_context = foo_context.children.first
124
- expect(bar_context).to be_instance_of Reek::Context::SingletonMethodContext
125
- expect(bar_context.parent).to eq foo_context
126
- end
127
- end
128
-
129
- describe 'statement counting' do
130
- def tree(code)
131
- described_class.new(syntax_tree(code)).context_tree
132
- end
133
-
134
- def number_of_statements_for(code)
135
- tree(code).children.first.number_of_statements
136
- end
137
-
138
- it 'counts 1 assignment' do
139
- code = 'def one() val = 4; end'
140
- expect(number_of_statements_for(code)).to eq(1)
141
- end
142
-
143
- it 'counts 3 assignments' do
144
- code = 'def one() val = 4; val = 4; val = 4; end'
145
- expect(number_of_statements_for(code)).to eq(3)
146
- end
147
-
148
- it 'counts 1 attr assignment' do
149
- code = 'def one() val[0] = 4; end'
150
- expect(number_of_statements_for(code)).to eq(1)
151
- end
152
-
153
- it 'counts 1 increment assignment' do
154
- code = 'def one() val += 4; end'
155
- expect(number_of_statements_for(code)).to eq(1)
156
- end
157
-
158
- it 'counts 1 increment attr assignment' do
159
- code = 'def one() val[0] += 4; end'
160
- expect(number_of_statements_for(code)).to eq(1)
161
- end
162
-
163
- it 'counts 1 nested assignment' do
164
- code = 'def one() val = fred = 4; end'
165
- expect(number_of_statements_for(code)).to eq(1)
166
- end
167
-
168
- it 'counts returns' do
169
- code = 'def one() val = 4; true; end'
170
- expect(number_of_statements_for(code)).to eq(2)
171
- end
172
-
173
- it 'counts nil returns' do
174
- code = 'def one() val = 4; nil; end'
175
- expect(number_of_statements_for(code)).to eq(2)
176
- end
177
-
178
- context 'with control statements' do
179
- it 'counts 3 statements in a conditional expression' do
180
- code = 'def one() if val == 4; callee(); callee(); callee(); end; end'
181
- expect(number_of_statements_for(code)).to eq(3)
182
- end
183
-
184
- it 'counts 3 statements in an else' do
185
- code = <<-RUBY
186
- def one()
187
- if val == 4
188
- callee(); callee(); callee()
189
- else
190
- callee(); callee(); callee()
191
- end
192
- end
193
- RUBY
194
-
195
- expect(number_of_statements_for(code)).to eq(6)
196
- end
197
-
198
- it 'does not count constant assignment with or equals' do
199
- code = 'class Hi; CONST ||= 1; end'
200
- expect(number_of_statements_for(code)).to eq(0)
201
- end
202
-
203
- it 'does not count multi constant assignment' do
204
- code = 'class Hi; CONST, OTHER_CONST = 1, 2; end'
205
- expect(number_of_statements_for(code)).to eq(0)
206
- end
207
-
208
- it 'does not count empty conditional expression' do
209
- code = 'def one() if val == 4; ; end; end'
210
- expect(number_of_statements_for(code)).to eq(0)
211
- end
212
-
213
- it 'does not count empty else' do
214
- code = 'def one() if val == 4; ; else; ; end; end'
215
- expect(number_of_statements_for(code)).to eq(0)
216
- end
217
-
218
- it 'counts extra statements in an if condition' do
219
- code = 'def one() if begin val = callee(); val < 4 end; end; end'
220
- expect(number_of_statements_for(code)).to eq(1)
221
- end
222
-
223
- it 'counts 3 statements in a while loop' do
224
- code = 'def one() while val < 4; callee(); callee(); callee(); end; end'
225
- expect(number_of_statements_for(code)).to eq(3)
226
- end
227
-
228
- it 'counts extra statements in a while condition' do
229
- code = 'def one() while begin val = callee(); val < 4 end; end; end'
230
- expect(number_of_statements_for(code)).to eq(1)
231
- end
232
-
233
- it 'counts 3 statements in a until loop' do
234
- code = 'def one() until val < 4; callee(); callee(); callee(); end; end'
235
- expect(number_of_statements_for(code)).to eq(3)
236
- end
237
-
238
- it 'counts 3 statements in a for loop' do
239
- code = 'def one() for i in 0..4; callee(); callee(); callee(); end; end'
240
- expect(number_of_statements_for(code)).to eq(3)
241
- end
242
-
243
- it 'counts 3 statements in a rescue' do
244
- code = <<-RUBY
245
- def one()
246
- begin
247
- callee(); callee(); callee()
248
- rescue
249
- callee(); callee(); callee()
250
- end
251
- end
252
- RUBY
253
- expect(number_of_statements_for(code)).to eq(6)
254
- end
255
-
256
- it 'counts 3 statements in a when' do
257
- code = <<-RUBY
258
- def one()
259
- case fred
260
- when "hi" then callee(); callee()
261
- when "lo" then callee()
262
- end
263
- end
264
- RUBY
265
- expect(number_of_statements_for(code)).to eq(3)
266
- end
267
-
268
- it 'counts 3 statements in a case else' do
269
- code = <<-RUBY
270
- def one()
271
- case fred
272
- when "hi" then callee(); callee(); callee()
273
- else callee(); callee(); callee()
274
- end
275
- end
276
- RUBY
277
- expect(number_of_statements_for(code)).to eq(6)
278
- end
279
-
280
- it 'does not count empty case' do
281
- code = 'def one() case fred; when "hi"; ; when "lo"; ; end; end'
282
- expect(number_of_statements_for(code)).to eq(0)
283
- end
284
-
285
- it 'does not count empty case else' do
286
- code = 'def one() case fred; when "hi"; ; else; ; end; end'
287
- expect(number_of_statements_for(code)).to eq(0)
288
- end
289
-
290
- it 'counts 4 statements in an iterator' do
291
- code = 'def one() fred.each do; callee(); callee(); callee(); end; end'
292
- expect(number_of_statements_for(code)).to eq(4)
293
- end
294
-
295
- it 'counts 1 statement in a singleton method' do
296
- code = 'def self.foo; callee(); end'
297
- expect(number_of_statements_for(code)).to eq(1)
298
- end
299
- end
300
- end
301
-
302
- describe 'visibility tracking' do
303
- def context_tree_for(code)
304
- described_class.new(syntax_tree(code)).context_tree
305
- end
306
-
307
- it 'marks instance methods when using a def modifier' do
308
- code = <<-RUBY
309
- class Foo
310
- private def bar
311
- end
312
-
313
- def baz
314
- end
315
- end
316
- RUBY
317
-
318
- root = context_tree_for(code)
319
- module_context = root.children.first
320
- method_contexts = module_context.children
321
- aggregate_failures do
322
- expect(method_contexts[0].visibility).to eq :private
323
- expect(method_contexts[1].visibility).to eq :public
324
- end
325
- end
326
-
327
- it 'does not mark class methods with instance visibility' do
328
- code = <<-RUBY
329
- class Foo
330
- private
331
- def bar
332
- end
333
- def self.baz
334
- end
335
- end
336
- RUBY
337
-
338
- root = context_tree_for(code)
339
- module_context = root.children.first
340
- method_contexts = module_context.children
341
- expect(method_contexts[0].visibility).to eq :private
342
- expect(method_contexts[1].visibility).to eq :public
343
- end
344
-
345
- it 'only marks existing instance methods using later instance method modifiers' do
346
- code = <<-RUBY
347
- class Foo
348
- def bar
349
- end
350
-
351
- def baz
352
- end
353
-
354
- def self.bar
355
- end
356
-
357
- class << self
358
- def bar
359
- end
360
- end
361
-
362
- private :bar, :baz
363
- end
364
- RUBY
365
-
366
- root = context_tree_for(code)
367
- module_context = root.children.first
368
- method_contexts = module_context.children
369
- expect(method_contexts[0].visibility).to eq :private
370
- expect(method_contexts[1].visibility).to eq :private
371
- expect(method_contexts[2].visibility).to eq :public
372
- expect(method_contexts[3].visibility).to eq :public
373
- end
374
-
375
- it 'only marks existing instance attributes using later instance method modifiers' do
376
- code = <<-RUBY
377
- class Foo
378
- attr_writer :bar
379
-
380
- class << self
381
- attr_writer :bar
382
- end
383
-
384
- private :bar
385
- end
386
- RUBY
387
-
388
- root = context_tree_for(code)
389
- module_context = root.children.first
390
- method_contexts = module_context.children
391
- expect(method_contexts[0].visibility).to eq :private
392
- expect(method_contexts[1].visibility).to eq :public
393
- end
394
-
395
- it 'marks class method visibility using private_class_method' do
396
- code = <<-RUBY
397
- class Foo
398
- def self.baz
399
- end
400
-
401
- private_class_method :baz
402
- end
403
- RUBY
404
-
405
- root = context_tree_for(code)
406
- module_context = root.children.first
407
- method_contexts = module_context.children
408
- expect(method_contexts[0].visibility).to eq :private
409
- end
410
-
411
- it 'marks class method visibility using public_class_method' do
412
- code = <<-RUBY
413
- class Foo
414
- class << self
415
- private
416
-
417
- def baz
418
- end
419
- end
420
-
421
- public_class_method :baz
422
- end
423
- RUBY
424
-
425
- root = context_tree_for(code)
426
- module_context = root.children.first
427
- method_contexts = module_context.children
428
- expect(method_contexts[0].visibility).to eq :public
429
- end
430
-
431
- it 'correctly skips nested modules' do
432
- code = <<-RUBY
433
- class Foo
434
- class Bar
435
- def baz
436
- end
437
- end
438
-
439
- def baz
440
- end
441
-
442
- def self.bar
443
- end
444
-
445
- private :baz
446
- private_class_method :bar
447
- end
448
- RUBY
449
-
450
- root = context_tree_for(code)
451
- foo_context = root.children.first
452
- bar_context = foo_context.children.first
453
- nested_baz_context = bar_context.children.first
454
- expect(nested_baz_context.visibility).to eq :public
455
- end
456
- end
457
- end
@@ -1,22 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/smell_detectors/base_detector'
3
- require_lib 'reek/detector_repository'
4
-
5
- RSpec.describe Reek::DetectorRepository do
6
- describe '.smell_types' do
7
- let(:smell_types) { described_class.smell_types }
8
-
9
- it 'includes existing smell_types' do
10
- expect(smell_types).to include(Reek::SmellDetectors::IrresponsibleModule,
11
- Reek::SmellDetectors::TooManyStatements)
12
- end
13
-
14
- it 'excludes the smell detector base class' do
15
- expect(smell_types).not_to include(Reek::SmellDetectors::BaseDetector)
16
- end
17
-
18
- it 'returns the smell types in alphabetic order' do
19
- expect(smell_types).to eq(smell_types.sort_by(&:name))
20
- end
21
- end
22
- end
@@ -1,20 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- RSpec.describe Reek::DocumentationLink do
4
- describe '.build' do
5
- it 'returns the correct link for a smell type' do
6
- expect(described_class.build('FeatureEnvy')).
7
- to eq "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Feature-Envy.md"
8
- end
9
-
10
- it 'returns the correct link for general documentation' do
11
- expect(described_class.build('Rake Task')).
12
- to eq "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Rake-Task.md"
13
- end
14
-
15
- it 'returns the correct link for subjects with abbreviations' do
16
- expect(described_class.build('YAML Report')).
17
- to eq "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/YAML-Report.md"
18
- end
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- require_relative '../../spec_helper'
2
-
3
- require_lib 'reek/errors/base_error'
4
-
5
- RSpec.describe Reek::Errors::BaseError do
6
- let(:error) { described_class.new }
7
-
8
- describe '#long_message' do
9
- it 'returns the message' do
10
- expect(error.long_message).to eq error.message
11
- end
12
- end
13
- end