reek 6.0.3 → 6.0.4

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 (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/CONTRIBUTING.md +3 -0
  4. data/Dockerfile +1 -1
  5. data/Gemfile +6 -6
  6. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  7. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  8. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  9. data/lib/reek/smell_warning.rb +1 -1
  10. data/lib/reek/source/source_locator.rb +1 -3
  11. data/lib/reek/version.rb +1 -1
  12. data/reek.gemspec +4 -1
  13. metadata +3 -208
  14. data/docs/API.md +0 -174
  15. data/docs/Attribute.md +0 -39
  16. data/docs/Basic-Smell-Options.md +0 -85
  17. data/docs/Boolean-Parameter.md +0 -54
  18. data/docs/Class-Variable.md +0 -40
  19. data/docs/Code-Smells.md +0 -39
  20. data/docs/Command-Line-Options.md +0 -119
  21. data/docs/Control-Couple.md +0 -26
  22. data/docs/Control-Parameter.md +0 -32
  23. data/docs/Data-Clump.md +0 -46
  24. data/docs/Duplicate-Method-Call.md +0 -264
  25. data/docs/Feature-Envy.md +0 -93
  26. data/docs/How-To-Write-New-Detectors.md +0 -132
  27. data/docs/How-reek-works-internally.md +0 -114
  28. data/docs/Instance-Variable-Assumption.md +0 -163
  29. data/docs/Irresponsible-Module.md +0 -47
  30. data/docs/Large-Class.md +0 -16
  31. data/docs/Long-Parameter-List.md +0 -39
  32. data/docs/Long-Yield-List.md +0 -37
  33. data/docs/Manual-Dispatch.md +0 -30
  34. data/docs/Missing-Safe-Method.md +0 -92
  35. data/docs/Module-Initialize.md +0 -62
  36. data/docs/Nested-Iterators.md +0 -59
  37. data/docs/Nil-Check.md +0 -47
  38. data/docs/RSpec-matchers.md +0 -129
  39. data/docs/Rake-Task.md +0 -66
  40. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  41. data/docs/Reek-Driven-Development.md +0 -46
  42. data/docs/Repeated-Conditional.md +0 -47
  43. data/docs/Simulated-Polymorphism.md +0 -16
  44. data/docs/Smell-Suppression.md +0 -96
  45. data/docs/Style-Guide.md +0 -19
  46. data/docs/Subclassed-From-Core-Class.md +0 -79
  47. data/docs/Too-Many-Constants.md +0 -37
  48. data/docs/Too-Many-Instance-Variables.md +0 -43
  49. data/docs/Too-Many-Methods.md +0 -56
  50. data/docs/Too-Many-Statements.md +0 -54
  51. data/docs/Uncommunicative-Method-Name.md +0 -94
  52. data/docs/Uncommunicative-Module-Name.md +0 -92
  53. data/docs/Uncommunicative-Name.md +0 -18
  54. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  55. data/docs/Uncommunicative-Variable-Name.md +0 -96
  56. data/docs/Unused-Parameters.md +0 -28
  57. data/docs/Unused-Private-Method.md +0 -101
  58. data/docs/Utility-Function.md +0 -56
  59. data/docs/Versioning-Policy.md +0 -7
  60. data/docs/YAML-Reports.md +0 -93
  61. data/docs/defaults.reek.yml +0 -129
  62. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  63. data/docs/templates/default/docstring/setup.rb +0 -35
  64. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  65. data/docs/yard_plugin.rb +0 -17
  66. data/features/command_line_interface/basic_usage.feature +0 -15
  67. data/features/command_line_interface/options.feature +0 -123
  68. data/features/command_line_interface/show_progress.feature +0 -33
  69. data/features/command_line_interface/smell_selection.feature +0 -15
  70. data/features/command_line_interface/smells_count.feature +0 -38
  71. data/features/command_line_interface/stdin.feature +0 -65
  72. data/features/configuration_files/accept_setting.feature +0 -87
  73. data/features/configuration_files/directory_specific_directives.feature +0 -274
  74. data/features/configuration_files/exclude_directives.feature +0 -35
  75. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  76. data/features/configuration_files/masking_smells.feature +0 -94
  77. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  78. data/features/configuration_files/reject_setting.feature +0 -89
  79. data/features/configuration_files/schema_validation.feature +0 -59
  80. data/features/configuration_files/show_configuration_file.feature +0 -44
  81. data/features/configuration_files/unused_private_method.feature +0 -68
  82. data/features/configuration_loading.feature +0 -91
  83. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  84. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  85. data/features/locales.feature +0 -32
  86. data/features/programmatic_access.feature +0 -41
  87. data/features/rake_task/rake_task.feature +0 -138
  88. data/features/reports/codeclimate.feature +0 -59
  89. data/features/reports/json.feature +0 -59
  90. data/features/reports/reports.feature +0 -219
  91. data/features/reports/yaml.feature +0 -52
  92. data/features/rspec_matcher.feature +0 -41
  93. data/features/samples.feature +0 -305
  94. data/features/step_definitions/.rubocop.yml +0 -5
  95. data/features/step_definitions/reek_steps.rb +0 -102
  96. data/features/step_definitions/sample_file_steps.rb +0 -63
  97. data/features/support/env.rb +0 -33
  98. data/features/todo_list.feature +0 -108
  99. data/samples/checkstyle.xml +0 -7
  100. data/samples/clean_source/clean.rb +0 -6
  101. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  102. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  103. data/samples/configuration/corrupt.reek +0 -1
  104. data/samples/configuration/empty.reek +0 -0
  105. data/samples/configuration/full_configuration.reek +0 -13
  106. data/samples/configuration/full_mask.reek +0 -6
  107. data/samples/configuration/home/home.reek.yml +0 -4
  108. data/samples/configuration/partial_mask.reek +0 -4
  109. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  110. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  111. data/samples/configuration/with_excluded_paths.reek +0 -5
  112. data/samples/no_config_file/.keep +0 -0
  113. data/samples/paths.rb +0 -5
  114. data/samples/smelly_source/inline.rb +0 -704
  115. data/samples/smelly_source/optparse.rb +0 -1788
  116. data/samples/smelly_source/redcloth.rb +0 -1130
  117. data/samples/smelly_source/ruby.rb +0 -368
  118. data/samples/smelly_source/smelly.rb +0 -7
  119. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  120. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  121. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  122. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  123. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  124. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  125. data/samples/source_with_non_ruby_files/gibberish +0 -1
  126. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  127. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  128. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  129. data/spec/quality/documentation_spec.rb +0 -41
  130. data/spec/quality/reek_source_spec.rb +0 -11
  131. data/spec/reek/ast/node_spec.rb +0 -211
  132. data/spec/reek/ast/object_refs_spec.rb +0 -83
  133. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  134. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  135. data/spec/reek/cli/application_spec.rb +0 -168
  136. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  137. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  138. data/spec/reek/cli/options_spec.rb +0 -51
  139. data/spec/reek/cli/silencer_spec.rb +0 -28
  140. data/spec/reek/code_comment_spec.rb +0 -184
  141. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  142. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  143. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  144. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  145. data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
  146. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  147. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  148. data/spec/reek/context/code_context_spec.rb +0 -192
  149. data/spec/reek/context/ghost_context_spec.rb +0 -60
  150. data/spec/reek/context/method_context_spec.rb +0 -72
  151. data/spec/reek/context/module_context_spec.rb +0 -55
  152. data/spec/reek/context/root_context_spec.rb +0 -12
  153. data/spec/reek/context/statement_counter_spec.rb +0 -24
  154. data/spec/reek/context_builder_spec.rb +0 -457
  155. data/spec/reek/detector_repository_spec.rb +0 -22
  156. data/spec/reek/documentation_link_spec.rb +0 -20
  157. data/spec/reek/errors/base_error_spec.rb +0 -13
  158. data/spec/reek/examiner_spec.rb +0 -309
  159. data/spec/reek/logging_error_handler_spec.rb +0 -24
  160. data/spec/reek/rake/task_spec.rb +0 -56
  161. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  162. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  163. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  164. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  165. data/spec/reek/report/html_report_spec.rb +0 -19
  166. data/spec/reek/report/json_report_spec.rb +0 -58
  167. data/spec/reek/report/location_formatter_spec.rb +0 -32
  168. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  169. data/spec/reek/report/text_report_spec.rb +0 -89
  170. data/spec/reek/report/xml_report_spec.rb +0 -24
  171. data/spec/reek/report/yaml_report_spec.rb +0 -55
  172. data/spec/reek/report_spec.rb +0 -28
  173. data/spec/reek/smell_configuration_spec.rb +0 -56
  174. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  175. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  176. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  177. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  178. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  179. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  180. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  181. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  182. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  183. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  184. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  185. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  186. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  187. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  188. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  189. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  190. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  191. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  192. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  193. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  194. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  195. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  196. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  197. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  198. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  199. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  200. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  201. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  202. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  203. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
  204. data/spec/reek/smell_warning_spec.rb +0 -137
  205. data/spec/reek/source/source_code_spec.rb +0 -79
  206. data/spec/reek/source/source_locator_spec.rb +0 -166
  207. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  208. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  209. data/spec/reek/spec/should_reek_spec.rb +0 -52
  210. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  211. data/spec/reek/tree_dresser_spec.rb +0 -46
  212. data/spec/spec_helper.rb +0 -110
  213. data/tasks/configuration.rake +0 -18
  214. data/tasks/console.rake +0 -5
  215. data/tasks/reek.rake +0 -6
  216. data/tasks/rubocop.rake +0 -11
  217. data/tasks/test.rake +0 -32
@@ -1,11 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- RSpec.describe 'Reek source code' do
4
- Pathname.glob('lib/**/*.rb').each do |pathname|
5
- describe pathname do
6
- it 'has no smells' do
7
- expect(pathname).not_to reek
8
- end
9
- end
10
- end
11
- end
@@ -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
@@ -1,498 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/ast/sexp_extensions'
3
-
4
- RSpec.describe Reek::AST::SexpExtensions::DefNode do
5
- context 'with no parameters' do
6
- let(:node) { sexp(:def, :hello, sexp(:args)) }
7
-
8
- it 'has no arg names' do
9
- expect(node.arg_names).to eq []
10
- end
11
-
12
- it 'has no parameter names' do
13
- expect(node.parameter_names).to eq []
14
- end
15
-
16
- it 'includes outer scope in its full name' do
17
- expect(node.full_name('Fred')).to eq 'Fred#hello'
18
- end
19
-
20
- it 'includes no marker in its full name with empty outer scope' do
21
- expect(node.full_name('')).to eq 'hello'
22
- end
23
- end
24
-
25
- context 'with 1 parameter' do
26
- let(:node) do
27
- sexp(:def, :hello,
28
- sexp(:args, sexp(:arg, :parameter)))
29
- end
30
-
31
- it 'has 1 arg name' do
32
- expect(node.arg_names).to eq [:parameter]
33
- end
34
-
35
- it 'has 1 parameter name' do
36
- expect(node.parameter_names).to eq [:parameter]
37
- end
38
-
39
- it 'includes outer scope in its full name' do
40
- expect(node.full_name('Fred')).to eq 'Fred#hello'
41
- end
42
-
43
- it 'includes no marker in its full name with empty outer scope' do
44
- expect(node.full_name('')).to eq 'hello'
45
- end
46
- end
47
-
48
- context 'with a block parameter' do
49
- let(:node) do
50
- sexp(:def, :hello,
51
- sexp(:args,
52
- sexp(:arg, :parameter),
53
- sexp(:blockarg, :blk)))
54
- end
55
-
56
- it 'has 1 arg name' do
57
- expect(node.arg_names).to eq [:parameter]
58
- end
59
-
60
- it 'has 2 parameter names' do
61
- expect(node.parameter_names).to eq [:parameter, :blk]
62
- end
63
-
64
- it 'includes outer scope in its full name' do
65
- expect(node.full_name('Fred')).to eq 'Fred#hello'
66
- end
67
-
68
- it 'includes no marker in its full name with empty outer scope' do
69
- expect(node.full_name('')).to eq 'hello'
70
- end
71
- end
72
-
73
- context 'with 1 defaulted parameter' do
74
- let(:node) do
75
- sexp(:def, :hello,
76
- sexp(:args,
77
- sexp(:optarg, :parameter, sexp(:array))))
78
- end
79
-
80
- it 'has 1 arg name' do
81
- expect(node.arg_names).to eq [:parameter]
82
- end
83
-
84
- it 'has 1 parameter name' do
85
- expect(node.parameter_names).to eq [:parameter]
86
- end
87
-
88
- it 'includes outer scope in its full name' do
89
- expect(node.full_name('Fred')).to eq 'Fred#hello'
90
- end
91
-
92
- it 'includes no marker in its full name with empty outer scope' do
93
- expect(node.full_name('')).to eq 'hello'
94
- end
95
- end
96
-
97
- context 'with a body with 2 statements' do
98
- let(:node) do
99
- sexp(:def, :hello, sexp(:args),
100
- sexp(:begin,
101
- sexp(:first),
102
- sexp(:second)))
103
- end
104
-
105
- it 'has 2 body statements' do
106
- expect(node.body).to eq sexp(:begin, sexp(:first), sexp(:second))
107
- end
108
-
109
- it 'finds nodes in the body with #body_nodes' do
110
- expect(node.body_nodes([:first]).to_a).to eq [sexp(:first)]
111
- end
112
- end
113
-
114
- context 'with no body' do
115
- let(:node) { sexp(:def, :hello, sexp(:args), nil) }
116
-
117
- it 'has a body that is nil' do
118
- expect(node.body).to be_nil
119
- end
120
-
121
- it 'finds no nodes in the body' do
122
- expect(node.body_nodes([:foo])).to eq []
123
- end
124
- end
125
- end
126
-
127
- RSpec.describe Reek::AST::SexpExtensions::CSendNode do
128
- let(:node) { Reek::Source::SourceCode.from('1&.foo(true)').syntax_tree }
129
-
130
- it 'has a class including SendNode' do
131
- expect(node.class.included_modules).to include(Reek::AST::SexpExtensions::SendNode)
132
- end
133
-
134
- it 'has a receiver' do
135
- expect(node.receiver).to eq(sexp(:int, 1))
136
- end
137
-
138
- it 'has a name' do
139
- expect(node.name).to eq(:foo)
140
- end
141
-
142
- it 'has arguments' do
143
- expect(node.args).to eq([sexp(:true)])
144
- end
145
- end
146
-
147
- RSpec.describe Reek::AST::SexpExtensions::DefsNode do
148
- context 'with no parameters' do
149
- let(:node) { sexp(:defs, sexp(:lvar, :obj), :hello, sexp(:args)) }
150
-
151
- it 'has no arg names' do
152
- expect(node.arg_names).to eq []
153
- end
154
-
155
- it 'has no parameter names' do
156
- expect(node.parameter_names).to eq []
157
- end
158
-
159
- it 'includes outer scope in its full name' do
160
- expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
161
- end
162
-
163
- it 'includes no marker in its full name with empty outer scope' do
164
- expect(node.full_name('')).to eq 'obj.hello'
165
- end
166
- end
167
-
168
- context 'with 1 parameter' do
169
- let(:node) do
170
- sexp(:defs, sexp(:lvar, :obj), :hello,
171
- sexp(:args, sexp(:arg, :parameter)))
172
- end
173
-
174
- it 'has 1 arg name' do
175
- expect(node.arg_names).to eq [:parameter]
176
- end
177
-
178
- it 'has 1 parameter name' do
179
- expect(node.parameter_names).to eq [:parameter]
180
- end
181
-
182
- it 'includes outer scope in its full name' do
183
- expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
184
- end
185
-
186
- it 'includes no marker in its full name with empty outer scope' do
187
- expect(node.full_name('')).to eq 'obj.hello'
188
- end
189
- end
190
-
191
- context 'with a block' do
192
- let(:node) do
193
- sexp(:defs, sexp(:lvar, :obj), :hello,
194
- sexp(:args,
195
- sexp(:arg, :parameter),
196
- sexp(:blockarg, :blk)))
197
- end
198
-
199
- it 'has 1 arg name' do
200
- expect(node.arg_names).to eq [:parameter]
201
- end
202
-
203
- it 'has 2 parameter names' do
204
- expect(node.parameter_names).to eq [:parameter, :blk]
205
- end
206
-
207
- it 'includes outer scope in its full name' do
208
- expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
209
- end
210
-
211
- it 'includes no marker in its full name with empty outer scope' do
212
- expect(node.full_name('')).to eq 'obj.hello'
213
- end
214
- end
215
-
216
- context 'with 1 defaulted parameter' do
217
- let(:node) do
218
- sexp(:defs, sexp(:lvar, :obj), :hello,
219
- sexp(:args,
220
- sexp(:optarg, :parameter, sexp(:array))))
221
- end
222
-
223
- it 'has 1 arg name' do
224
- expect(node.arg_names).to eq [:parameter]
225
- end
226
-
227
- it 'has 1 parameter name' do
228
- expect(node.parameter_names).to eq [:parameter]
229
- end
230
-
231
- it 'includes outer scope in its full name' do
232
- expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
233
- end
234
-
235
- it 'includes no marker in its full name with empty outer scope' do
236
- expect(node.full_name('')).to eq 'obj.hello'
237
- end
238
- end
239
-
240
- context 'with a body with 2 statements' do
241
- let(:node) do
242
- sexp(:defs, sexp(:self), :hello, sexp(:args),
243
- sexp(:begin,
244
- sexp(:first),
245
- sexp(:second)))
246
- end
247
-
248
- it 'has 2 body statements' do
249
- expect(node.body).to eq sexp(:begin, sexp(:first), sexp(:second))
250
- end
251
- end
252
- end
253
-
254
- RSpec.describe Reek::AST::SexpExtensions::LvarNode do
255
- let(:node) { sexp(:lvar, :foo) }
256
-
257
- describe '#var_name' do
258
- it 'returns the lvar’s name' do
259
- expect(node.var_name).to eq(:foo)
260
- end
261
- end
262
- end
263
-
264
- RSpec.describe Reek::AST::SexpExtensions::ConstNode do
265
- describe '#name' do
266
- it 'returns the fully qualified name' do
267
- node = sexp(:const, sexp(:const, sexp(:cbase), :Parser), :AST)
268
-
269
- expect(node.name).to eq "#{sexp(:const, sexp(:cbase), :Parser)}::AST"
270
- end
271
-
272
- it 'returns only the name in case of no namespace' do
273
- node = sexp(:const, nil, :AST)
274
-
275
- expect(node.name).to eq 'AST'
276
- end
277
- end
278
-
279
- describe '#simple_name' do
280
- it 'returns the name' do
281
- node = sexp(:const, sexp(:const, nil, :Rake), :TaskLib)
282
-
283
- expect(node.simple_name).to eq :TaskLib
284
- end
285
- end
286
-
287
- describe '#namespace' do
288
- it 'returns the namespace' do
289
- node = sexp(:const, :Parser, :AST)
290
-
291
- expect(node.namespace).to eq :Parser
292
- end
293
-
294
- it 'returns nil in case of no namespace' do
295
- node = sexp(:const, nil, :AST)
296
-
297
- expect(node.namespace).to be_nil
298
- end
299
- end
300
- end
301
-
302
- RSpec.describe Reek::AST::SexpExtensions::SendNode do
303
- context 'with no parameters' do
304
- let(:node) { sexp(:send, nil, :hello) }
305
-
306
- it 'is not considered to be a writable attr' do
307
- expect(sexp(:send, nil, :attr)).not_to be_attr_with_writable_flag
308
- end
309
- end
310
-
311
- context 'when it’s ‘new’ with no parameters and no receiver' do
312
- let(:bare_new) { sexp(:send, nil, :new) }
313
-
314
- it 'is not considered to be a module creation call' do
315
- expect(bare_new).not_to be_module_creation_call
316
- end
317
-
318
- it 'is not considered to have a module creation receiver' do
319
- expect(bare_new).not_to be_module_creation_receiver
320
- end
321
-
322
- it 'is considered to be an object creation call' do
323
- expect(bare_new).to be_object_creation_call
324
- end
325
- end
326
-
327
- context 'when it’s ‘new’ with a complex receiver' do
328
- let(:node) { Reek::Source::SourceCode.from('(foo ? bar : baz).new').syntax_tree }
329
-
330
- it 'is not considered to be a module creation call' do
331
- expect(node).not_to be_module_creation_call
332
- end
333
-
334
- it 'is not considered to have a module creation receiver' do
335
- expect(node).not_to be_module_creation_receiver
336
- end
337
-
338
- it 'is considered to be an object creation call' do
339
- expect(node).to be_object_creation_call
340
- end
341
- end
342
- end
343
-
344
- RSpec.describe Reek::AST::SexpExtensions::BlockNode do
345
- context 'with no parameters' do
346
- let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args), nil) }
347
-
348
- it 'has no parameter names' do
349
- expect(node.parameter_names).to eq []
350
- end
351
-
352
- it 'has a name' do
353
- expect(node.simple_name).to eq(:block)
354
- end
355
- end
356
-
357
- context 'with 1 parameter' do
358
- let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args, :parameter), nil) }
359
-
360
- it 'has 1 parameter name' do
361
- expect(node.parameter_names).to eq [:parameter]
362
- end
363
- end
364
-
365
- context 'with 2 parameters' do
366
- let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args, :x, :y), nil) }
367
-
368
- it 'has 2 parameter names' do
369
- expect(node.parameter_names).to eq [:x, :y]
370
- end
371
- end
372
- end
373
-
374
- RSpec.describe Reek::AST::SexpExtensions::LambdaNode do
375
- let(:node) { sexp(:lambda) }
376
-
377
- describe '#name' do
378
- it 'returns :lambda' do
379
- expect(node.name).to eq 'lambda'
380
- end
381
- end
382
- end
383
-
384
- RSpec.describe Reek::AST::SexpExtensions::ModuleNode do
385
- context 'with a simple name' do
386
- let(:exp) do
387
- Reek::Source::SourceCode.from('module Fred; end').syntax_tree
388
- end
389
-
390
- it 'has the correct #name' do
391
- expect(exp.name).to eq 'Fred'
392
- end
393
-
394
- it 'has the correct #simple_name' do
395
- expect(exp.simple_name).to eq 'Fred'
396
- end
397
-
398
- it 'has a simple full_name' do
399
- expect(exp.full_name('')).to eq 'Fred'
400
- end
401
-
402
- it 'has a fq full_name' do
403
- expect(exp.full_name('Blimey::O::Reilly')).to eq 'Blimey::O::Reilly::Fred'
404
- end
405
- end
406
-
407
- context 'with a scoped name' do
408
- let(:exp) do
409
- Reek::Source::SourceCode.from('module Foo::Bar; end').syntax_tree
410
- end
411
-
412
- it 'has the correct #name' do
413
- expect(exp.name).to eq 'Foo::Bar'
414
- end
415
-
416
- it 'has the correct #simple_name' do
417
- expect(exp.simple_name).to eq 'Bar'
418
- end
419
-
420
- it 'has a simple full_name' do
421
- expect(exp.full_name('')).to eq 'Foo::Bar'
422
- end
423
-
424
- it 'has a fully qualified full_name' do
425
- expect(exp.full_name('Blimey::O::Reilly')).to eq 'Blimey::O::Reilly::Foo::Bar'
426
- end
427
- end
428
-
429
- context 'with a name scoped in a namespace that is not a constant' do
430
- let(:exp) do
431
- Reek::Source::SourceCode.from('module foo::Bar; end').syntax_tree
432
- end
433
-
434
- it 'has the correct #name' do
435
- expect(exp.name).to eq 'foo::Bar'
436
- end
437
-
438
- it 'has the correct #simple_name' do
439
- expect(exp.simple_name).to eq 'Bar'
440
- end
441
- end
442
- end
443
-
444
- RSpec.describe Reek::AST::SexpExtensions::CasgnNode do
445
- describe '#defines_module?' do
446
- it 'is false for single assignment' do
447
- exp = sexp(:casgn, nil, :Foo)
448
- expect(exp).not_to be_defines_module
449
- end
450
-
451
- it 'is false for implicit receiver to new' do
452
- exp = sexp(:casgn, nil, :Foo, sexp(:send, nil, :new))
453
- expect(exp).not_to be_defines_module
454
- end
455
-
456
- it 'is true for explicit receiver to new' do
457
- exp = Reek::Source::SourceCode.from('Foo = Class.new(Bar)').syntax_tree
458
- expect(exp).to be_defines_module
459
- end
460
-
461
- it 'is false for assigning a lambda to a constant' do
462
- exp = Reek::Source::SourceCode.from('C = ->{}').syntax_tree
463
- expect(exp).not_to be_defines_module
464
- end
465
-
466
- it 'is false for assigning a string to a constant' do
467
- exp = Reek::Source::SourceCode.from('C = "hello"').syntax_tree
468
- expect(exp).not_to be_defines_module
469
- end
470
- end
471
-
472
- describe '#superclass' do
473
- it 'returns the superclass from the class definition' do
474
- exp = Reek::Source::SourceCode.from('Foo = Class.new(Bar)').syntax_tree
475
- expect(exp.superclass).to eq sexp(:const, nil, :Bar)
476
- end
477
-
478
- it 'returns nil in case of no class definition' do
479
- exp = Reek::Source::SourceCode.from('Foo = 23').syntax_tree
480
- expect(exp.superclass).to be_nil
481
- end
482
-
483
- it 'returns nil in case of no superclass' do
484
- exp = Reek::Source::SourceCode.from('Foo = Class.new').syntax_tree
485
- expect(exp.superclass).to be_nil
486
- end
487
-
488
- it 'returns nothing for a class definition using Struct.new' do
489
- exp = Reek::Source::SourceCode.from('Foo = Struct.new("Bar")').syntax_tree
490
- expect(exp.superclass).to be_nil
491
- end
492
-
493
- it 'returns nothing for a constant assigned with a bare method call' do
494
- exp = Reek::Source::SourceCode.from('Foo = foo("Bar")').syntax_tree
495
- expect(exp.superclass).to be_nil
496
- end
497
- end
498
- end