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,211 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/ast/node'
3
-
4
- RSpec.describe Reek::AST::Node do
5
- describe '#each_node' do
6
- context 'with an empty module' do
7
- let(:ast) do
8
- src = 'module Emptiness; end'
9
- Reek::Source::SourceCode.from(src).syntax_tree
10
- end
11
-
12
- it 'yields no calls' do
13
- ast.each_node(:send, []) { |exp| raise "#{exp} yielded by empty module!" }
14
- end
15
-
16
- it 'yields one module' do
17
- mods = 0
18
- ast.each_node(:module, []) { |_exp| mods += 1 }
19
- expect(mods).to eq(1)
20
- end
21
-
22
- it "yields the module's full AST" do
23
- ast.each_node(:module, []) do |exp|
24
- expect(exp).to eq(sexp(:module, sexp(:const, nil, :Emptiness), nil))
25
- end
26
- end
27
-
28
- it 'returns an enumerator when no block is passed' do
29
- expect(ast.each_node(:if)).to be_instance_of Enumerator
30
- end
31
- end
32
-
33
- context 'with a nested element' do
34
- let(:ast) do
35
- src = "module Loneliness; def calloo; puts('hello') end; end"
36
- Reek::Source::SourceCode.from(src).syntax_tree
37
- end
38
-
39
- it 'yields no ifs' do
40
- ast.each_node(:if) { |exp| raise "#{exp} yielded by empty module!" }
41
- end
42
-
43
- it 'yields one module' do
44
- expect(ast.each_node(:module).to_a.length).to eq(1)
45
- end
46
-
47
- it "yields the module's full AST" do
48
- ast.each_node(:module) do |exp|
49
- expect(exp).to eq sexp(:module,
50
- sexp(:const, nil, :Loneliness),
51
- sexp(:def, :calloo,
52
- sexp(:args),
53
- sexp(:send, nil, :puts, sexp(:str, 'hello'))))
54
- end
55
- end
56
-
57
- it 'yields one method' do
58
- expect(ast.each_node(:def).to_a.length).to eq(1)
59
- end
60
-
61
- it "yields the method's full AST" do
62
- ast.each_node(:def, []) { |exp| expect(exp.children.first).to eq(:calloo) }
63
- end
64
-
65
- it 'ignores the call inside the method if the traversal is pruned' do
66
- expect(ast.each_node(:send, [:def]).to_a).to be_empty
67
- end
68
- end
69
-
70
- it 'finds 3 ifs in a class' do
71
- src = <<-RUBY
72
- class Scrunch
73
- def first
74
- return @field == :sym ? 0 : 3;
75
- end
76
- def second
77
- if @field == :sym
78
- @other += " quarts"
79
- end
80
- end
81
- def third
82
- raise 'flu!' unless @field == :sym
83
- end
84
- end
85
- RUBY
86
- ast = Reek::Source::SourceCode.from(src).syntax_tree
87
- expect(ast.each_node(:if).to_a.length).to eq(3)
88
- end
89
- end
90
-
91
- describe '#format_to_ruby' do
92
- it 'returns #to_s if location is not present' do
93
- ast = sexp(:self)
94
- expect(ast.format_to_ruby).to eq ast.to_s
95
- end
96
-
97
- it 'gives the right result for self' do
98
- ast = Reek::Source::SourceCode.from('self').syntax_tree
99
- expect(ast.format_to_ruby).to eq 'self'
100
- end
101
-
102
- it 'gives the right result for a simple expression' do
103
- ast = Reek::Source::SourceCode.from('foo').syntax_tree
104
- expect(ast.format_to_ruby).to eq 'foo'
105
- end
106
-
107
- it 'gives the right result for a more complex expression' do
108
- ast = Reek::Source::SourceCode.from('foo(bar)').syntax_tree
109
- result = ast.format_to_ruby
110
- expect(result).to eq 'foo(bar)'
111
- end
112
-
113
- it 'gives te right result for send with a receiver' do
114
- ast = Reek::Source::SourceCode.from('baz.foo(bar)').syntax_tree
115
- expect(ast.format_to_ruby).to eq 'baz.foo(bar)'
116
- end
117
-
118
- it 'gives the right result for if' do
119
- source = <<-SRC
120
- if foo
121
- bar
122
- else
123
- baz
124
- qux
125
- end
126
- SRC
127
-
128
- ast = Reek::Source::SourceCode.from(source).syntax_tree
129
- expect(ast.format_to_ruby).to eq 'if foo ... end'
130
- end
131
-
132
- it 'gives the right result for def with no body' do
133
- source = "def my_method\nend"
134
- ast = Reek::Source::SourceCode.from(source).syntax_tree
135
- expect(ast.format_to_ruby).to eq 'def my_method; end'
136
- end
137
-
138
- it 'gives the right result for ivar' do
139
- source = '@foo'
140
- ast = Reek::Source::SourceCode.from(source).syntax_tree
141
- expect(ast.format_to_ruby).to eq '@foo'
142
- end
143
- end
144
-
145
- describe '#hash' do
146
- it 'hashes equal for equal sexps' do
147
- node1 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 4), :+, sexp(:send, nil, :fred)))
148
- node2 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 4), :+, sexp(:send, nil, :fred)))
149
- expect(node1.hash).to eq(node2.hash)
150
- end
151
-
152
- it 'hashes diferent for diferent sexps' do
153
- node1 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 4), :+, sexp(:send, nil, :fred)))
154
- node2 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 3), :+, sexp(:send, nil, :fred)))
155
- expect(node1.hash).not_to eq(node2.hash)
156
- end
157
- end
158
-
159
- describe '#length' do
160
- it 'counts itself as representing one statement' do
161
- expect(sexp(:foo).length).to eq 1
162
- end
163
- end
164
-
165
- describe '#line' do
166
- context 'with source from a file' do
167
- let(:file) { SMELLY_FILE }
168
- let(:ast) { Reek::Source::SourceCode.from(file).syntax_tree }
169
-
170
- it 'returns the right line number' do
171
- expect(ast.line).to eq(2)
172
- end
173
- end
174
-
175
- context 'with source from a string' do
176
- let(:source) { File.read(SMELLY_FILE) }
177
- let(:ast) { Reek::Source::SourceCode.from(source).syntax_tree }
178
-
179
- it 'returns the right line number' do
180
- expect(ast.line).to eq(2)
181
- end
182
- end
183
- end
184
-
185
- describe '#source' do
186
- context 'with source from a file' do
187
- let(:file) { SMELLY_FILE }
188
- let(:ast) { Reek::Source::SourceCode.from(file).syntax_tree }
189
-
190
- it 'returns the file name' do
191
- expect(ast.source).to eq(SMELLY_FILE.to_s)
192
- end
193
- end
194
-
195
- context 'with source from a string' do
196
- let(:source) { File.read SMELLY_FILE }
197
- let(:ast) { Reek::Source::SourceCode.from(source).syntax_tree }
198
-
199
- it 'returns "string"' do
200
- expect(ast.source).to eq('string')
201
- end
202
- end
203
- end
204
-
205
- describe '#name' do
206
- it 'returns #to_s if no override is present' do
207
- ast = sexp(:foo)
208
- expect(ast.name).to eq ast.to_s
209
- end
210
- end
211
- end
@@ -1,83 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/ast/object_refs'
3
-
4
- RSpec.describe Reek::AST::ObjectRefs do
5
- let(:refs) { described_class.new }
6
-
7
- context 'when empty' do
8
- it 'reports no refs to self' do
9
- expect(refs.references_to(:self)).to be_empty
10
- end
11
- end
12
-
13
- context 'with many refs to self' do
14
- before do
15
- refs.record_reference(name: :self)
16
- refs.record_reference(name: :self)
17
- refs.record_reference(name: :a)
18
- refs.record_reference(name: :self)
19
- refs.record_reference(name: :b)
20
- refs.record_reference(name: :a)
21
- refs.record_reference(name: :self)
22
- end
23
-
24
- it 'reports all refs to self' do
25
- expect(refs.references_to(:self).size).to eq(4)
26
- end
27
-
28
- it 'reports self among the max' do
29
- expect(refs.most_popular).to include(:self)
30
- end
31
-
32
- it 'reports self as the max' do
33
- expect(refs.self_is_max?).to eq(true)
34
- end
35
- end
36
-
37
- context 'when self is not the only max' do
38
- before do
39
- refs.record_reference(name: :a)
40
- refs.record_reference(name: :self)
41
- refs.record_reference(name: :self)
42
- refs.record_reference(name: :b)
43
- refs.record_reference(name: :a)
44
- end
45
-
46
- it 'reports all refs to self' do
47
- expect(refs.references_to(:self).size).to eq(2)
48
- end
49
-
50
- it 'reports self among the max' do
51
- expect(refs.most_popular).to include(:self)
52
- end
53
-
54
- it 'reports the other max among the max' do
55
- expect(refs.most_popular).to include(:a)
56
- end
57
-
58
- it 'reports self as the max' do
59
- expect(refs.self_is_max?).to eq(true)
60
- end
61
- end
62
-
63
- context 'when self is not recorded' do
64
- before do
65
- refs.record_reference(name: :a)
66
- refs.record_reference(name: :b)
67
- refs.record_reference(name: :a)
68
- refs.record_reference(name: :b)
69
- end
70
-
71
- it 'reports no refs to self' do
72
- expect(refs.references_to(:self).size).to eq(0)
73
- end
74
-
75
- it 'does not report self among the max' do
76
- expect(refs.most_popular).not_to include(:self)
77
- end
78
-
79
- it 'does not report self as the max' do
80
- expect(refs.self_is_max?).to eq(false)
81
- end
82
- end
83
- end
@@ -1,47 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/ast/reference_collector'
3
-
4
- RSpec.describe Reek::AST::ReferenceCollector do
5
- describe '#num_refs_to_self' do
6
- def refs_to_self(src)
7
- syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
8
- described_class.new(syntax_tree).num_refs_to_self
9
- end
10
-
11
- it 'with no refs to self' do
12
- expect(refs_to_self('def no_envy(arga) arga.barg end')).to eq(0)
13
- end
14
-
15
- it 'counts a call to super' do
16
- expect(refs_to_self('def simple() super; end')).to eq(1)
17
- end
18
-
19
- it 'counts a call to super with arguments' do
20
- expect(refs_to_self('def simple() super(); end')).to eq(1)
21
- end
22
-
23
- it 'counts a local call' do
24
- expect(refs_to_self('def simple() to_s; end')).to eq(1)
25
- end
26
-
27
- it 'counts a use of self' do
28
- expect(refs_to_self('def simple() lv = self; end')).to eq(1)
29
- end
30
-
31
- it 'counts a call with self as receiver' do
32
- expect(refs_to_self('def simple() self.to_s; end')).to eq(1)
33
- end
34
-
35
- it 'counts uses of an ivar' do
36
- expect(refs_to_self('def no_envy() @item.to_a; @item = 4; @item end')).to eq(3)
37
- end
38
-
39
- it 'counts an ivar passed to a method' do
40
- expect(refs_to_self('def no_envy(arga) arga.barg(@item); arga end')).to eq(1)
41
- end
42
-
43
- it 'ignores global variables' do
44
- expect(refs_to_self('def no_envy(arga) $s2.to_a; $s2[arga] end')).to eq(0)
45
- end
46
- end
47
- end