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,192 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/method_context'
3
- require_lib 'reek/context/module_context'
4
-
5
- RSpec.describe Reek::Context::CodeContext do
6
- describe '#full_name' do
7
- let(:ctx) { described_class.new(exp) }
8
- let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
9
- let(:exp_name) { 'random_name' }
10
- let(:full_name) { "::::::::::::::::::::#{exp_name}" }
11
-
12
- before do
13
- allow(exp).to receive(:name).and_return(exp_name)
14
- allow(exp).to receive(:full_name).and_return(full_name)
15
- end
16
-
17
- it 'creates the correct full name' do
18
- expect(ctx.full_name).to eq(full_name)
19
- end
20
-
21
- context 'when there is an outer' do
22
- let(:outer_name) { 'another_random sting' }
23
- let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
24
-
25
- before do
26
- ctx.register_with_parent outer
27
- allow(outer).to receive(:full_name).at_least(:once).and_return(outer_name)
28
- end
29
-
30
- it 'creates the correct full name' do
31
- expect(ctx.full_name).to eq(full_name)
32
- end
33
-
34
- it 'passes the outer name to exp#full_name' do
35
- ctx.full_name
36
- expect(exp).to have_received(:full_name).with outer_name
37
- end
38
- end
39
- end
40
-
41
- describe '#name' do
42
- let(:ctx) { described_class.new(exp) }
43
- let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
44
- let(:exp_name) { 'random_name' }
45
-
46
- before do
47
- allow(exp).to receive(:name).and_return(exp_name)
48
- end
49
-
50
- it 'gets its short name from the exp' do
51
- expect(ctx.name).to eq(exp_name)
52
- end
53
- end
54
-
55
- describe '#matches?' do
56
- let(:ctx) { described_class.new(exp) }
57
- let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
58
- let(:exp_name) { 'random_name' }
59
- let(:full_name) { "::::::::::::::::::::#{exp_name}" }
60
-
61
- before do
62
- allow(exp).to receive(:name).and_return(exp_name)
63
- allow(exp).to receive(:full_name).and_return(full_name)
64
- end
65
-
66
- it 'does not match an empty list' do
67
- expect(ctx.matches?([])).to eq(false)
68
- end
69
-
70
- it 'does not match when its own short name is not given' do
71
- expect(ctx.matches?(['banana'])).to eq(false)
72
- end
73
-
74
- it 'does not let pipe-ended Strings make matching ignore the rest' do
75
- expect(ctx.matches?(['banana|'])).to eq(false)
76
- end
77
-
78
- it 'recognises its own short name' do
79
- expect(ctx.matches?([exp_name])).to eq(true)
80
- end
81
-
82
- it 'recognises its own short name in a list' do
83
- expect(ctx.matches?(['banana', exp_name])).to eq(true)
84
- end
85
-
86
- it 'recognises its short name as a regex' do
87
- expect(ctx.matches?([/#{exp_name}/])).to eq(true)
88
- end
89
-
90
- it 'does not blow up on []-ended Strings' do
91
- expect(ctx.matches?(['banana[]', exp_name])).to eq(true)
92
- end
93
-
94
- it 'recognises its own full name' do
95
- expect(ctx.matches?(['banana', full_name])).to eq(true)
96
- end
97
-
98
- it 'recognises its full name as a regex' do
99
- expect(ctx.matches?([/banana/, /#{full_name}/])).to eq(true)
100
- end
101
-
102
- context 'when there is an outer' do
103
- let(:outer_name) { 'another_random sting' }
104
- let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
105
-
106
- before do
107
- ctx.register_with_parent outer
108
- allow(outer).to receive(:full_name).at_least(:once).and_return(outer_name)
109
- end
110
-
111
- it 'recognises its own full name' do
112
- expect(ctx.matches?(['banana', full_name])).to eq(true)
113
- end
114
-
115
- it 'recognises its full name as a regex' do
116
- expect(ctx.matches?([/banana/, /#{full_name}/])).to eq(true)
117
- end
118
- end
119
- end
120
-
121
- describe '#config_for' do
122
- let(:src) do
123
- <<-RUBY
124
- # :reek:DuplicateMethodCall { allow_calls: [ puts ] }')
125
- def repeated_greeting
126
- puts 'Hello!'
127
- puts 'Hello!'
128
- end
129
- RUBY
130
- end
131
- let(:expression) { Reek::Source::SourceCode.from(src).syntax_tree }
132
- let(:outer) { nil }
133
- let(:context) { described_class.new(expression) }
134
- let(:sniffer) { class_double('Reek::SmellDetectors::BaseDetector') }
135
-
136
- before do
137
- context.register_with_parent(outer)
138
- allow(sniffer).to receive(:smell_type).and_return('DuplicateMethodCall')
139
- end
140
-
141
- context 'when there is no outer context' do
142
- it 'gets its configuration from the expression comments' do
143
- expect(context.config_for(sniffer)).to eq('allow_calls' => ['puts'])
144
- end
145
- end
146
-
147
- context 'when there is an outer context' do
148
- let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
149
-
150
- before do
151
- allow(outer).to receive(:config_for).with(sniffer).and_return(
152
- 'max_calls' => 2)
153
- end
154
-
155
- it 'merges the outer config with its own configuration' do
156
- expect(context.config_for(sniffer)).to eq('allow_calls' => ['puts'],
157
- 'max_calls' => 2)
158
- end
159
- end
160
- end
161
-
162
- describe '#register_with_parent' do
163
- let(:context) { described_class.new(instance_double('Reek::AST::Node')) }
164
- let(:first_child) { described_class.new(instance_double('Reek::AST::Node')) }
165
- let(:second_child) { described_class.new(instance_double('Reek::AST::Node')) }
166
-
167
- it "appends the element to the parent context's list of children" do
168
- first_child.register_with_parent context
169
- second_child.register_with_parent context
170
-
171
- expect(context.children).to eq [first_child, second_child]
172
- end
173
- end
174
-
175
- describe '#each' do
176
- let(:context) { described_class.new(instance_double('Reek::AST::Node')) }
177
- let(:first_child) { described_class.new(instance_double('Reek::AST::Node')) }
178
- let(:second_child) { described_class.new(instance_double('Reek::AST::Node')) }
179
-
180
- it 'yields each child' do
181
- first_child.register_with_parent context
182
- second_child.register_with_parent context
183
-
184
- result = []
185
- context.each do |ctx|
186
- result << ctx
187
- end
188
-
189
- expect(result).to eq [context, first_child, second_child]
190
- end
191
- end
192
- end
@@ -1,60 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/code_context'
3
- require_lib 'reek/context/ghost_context'
4
-
5
- RSpec.describe Reek::Context::GhostContext do
6
- let(:exp) { instance_double('Reek::AST::Node') }
7
- let(:parent) { Reek::Context::CodeContext.new(exp) }
8
-
9
- describe '#register_with_parent' do
10
- it 'does not append itself to its parent' do
11
- ghost = described_class.new(nil)
12
- ghost.register_with_parent(parent)
13
- expect(parent.children).not_to include ghost
14
- end
15
- end
16
-
17
- describe '#append_child_context' do
18
- let(:ghost) { described_class.new(nil) }
19
-
20
- before do
21
- ghost.register_with_parent(parent)
22
- end
23
-
24
- it 'appends the child to the grandparent context' do
25
- child = Reek::Context::CodeContext.new(sexp(:foo))
26
- child.register_with_parent(ghost)
27
-
28
- expect(parent.children).to include child
29
- end
30
-
31
- it "sets the child's parent to the grandparent context" do
32
- child = Reek::Context::CodeContext.new(sexp(:foo))
33
- child.register_with_parent(ghost)
34
-
35
- expect(child.parent).to eq parent
36
- end
37
-
38
- it 'appends the child to the list of children' do
39
- child = Reek::Context::CodeContext.new(sexp(:foo))
40
- child.register_with_parent(ghost)
41
-
42
- expect(ghost.children).to include child
43
- end
44
-
45
- context 'when the grandparent is also a ghost' do
46
- let(:child_ghost) { described_class.new(nil) }
47
-
48
- before do
49
- child_ghost.register_with_parent(ghost)
50
- end
51
-
52
- it 'sets the childs parent to its remote ancestor' do
53
- child = Reek::Context::CodeContext.new(sexp(:foo))
54
- child.register_with_parent(child_ghost)
55
-
56
- expect(child.parent).to eq parent
57
- end
58
- end
59
- end
60
- end
@@ -1,72 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/method_context'
3
-
4
- RSpec.describe Reek::Context::MethodContext do
5
- let(:method_context) { described_class.new(exp, nil) }
6
-
7
- describe '#matches?' do
8
- let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode').as_null_object }
9
-
10
- before do
11
- allow(exp).to receive(:full_name).at_least(:once).and_return('mod')
12
- end
13
-
14
- it 'recognises itself in a collection of names' do
15
- expect(method_context.matches?(['banana', 'mod'])).to eq(true)
16
- end
17
-
18
- it 'does not recognise itself in a collection of names that does not include it' do
19
- expect(method_context.matches?(['banana'])).to eq(false)
20
- end
21
-
22
- it 'recognises itself in a collection of regular expressions' do
23
- expect(method_context.matches?([/banana/, /mod/])).to eq(true)
24
- end
25
-
26
- it 'does not recognise itself in a collection of regular expressions that do not match it' do
27
- expect(method_context.matches?([/banana/])).to eq(false)
28
- end
29
- end
30
-
31
- describe '#default_assignments' do
32
- def assignments_from(src)
33
- exp = Reek::Source::SourceCode.from(src).syntax_tree
34
- ctx = Reek::Context::MethodContext.new(exp, nil)
35
- ctx.default_assignments
36
- end
37
-
38
- context 'with no defaults' do
39
- it 'returns an empty hash' do
40
- src = 'def meth(arga, argb, &blk) end'
41
- expect(assignments_from(src)).to be_empty
42
- end
43
- end
44
-
45
- context 'with 1 default' do
46
- let(:defaults) { assignments_from('def meth(arga, argb=456, &blk) end') }
47
-
48
- it 'returns the param-value pair' do
49
- expect(defaults[0]).to eq [:argb, sexp(:int, 456)]
50
- end
51
-
52
- it 'returns the nothing else' do
53
- expect(defaults.length).to eq(1)
54
- end
55
- end
56
-
57
- context 'with 2 defaults' do
58
- let(:defaults) do
59
- assignments_from('def meth(arga=123, argb=456, &blk) end')
60
- end
61
-
62
- it 'returns both param-value pairs' do
63
- expect(defaults).to eq [[:arga, sexp(:int, 123)],
64
- [:argb, sexp(:int, 456)]]
65
- end
66
-
67
- it 'returns nothing else' do
68
- expect(defaults.length).to eq(2)
69
- end
70
- end
71
- end
72
- end
@@ -1,55 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/module_context'
3
- require_lib 'reek/context/root_context'
4
-
5
- RSpec.describe Reek::Context::ModuleContext do
6
- it 'reports module name for smell in method' do
7
- expect('
8
- module Fred
9
- def simple(x) x + 1; end
10
- end
11
- ').to reek_of(:UncommunicativeParameterName, name: 'x', context: 'Fred#simple')
12
- end
13
-
14
- it 'does not report module with empty class' do
15
- expect('
16
- # module for test
17
- module Fred
18
- # module for test
19
- class Jim; end; end').not_to reek
20
- end
21
-
22
- it 'recognises global constant' do
23
- expect('
24
- # module for test
25
- module ::Global
26
- # module for test
27
- class Inside; end; end').not_to reek
28
- end
29
-
30
- describe '#track_visibility' do
31
- let(:main_exp) { instance_double('Reek::AST::Node') }
32
- let(:first_def) { instance_double('Reek::AST::SexpExtensions::DefNode', name: :foo) }
33
- let(:second_def) { instance_double('Reek::AST::SexpExtensions::DefNode') }
34
-
35
- let(:context) { described_class.new(main_exp) }
36
- let(:first_child) { Reek::Context::MethodContext.new(first_def, main_exp) }
37
- let(:second_child) { Reek::Context::MethodContext.new(second_def, main_exp) }
38
-
39
- it 'sets visibility on subsequent child contexts' do
40
- context.append_child_context first_child
41
- context.track_visibility :private, []
42
- context.append_child_context second_child
43
- expect(first_child.visibility).to eq :public
44
- expect(second_child.visibility).to eq :private
45
- end
46
-
47
- it 'sets visibility on specifically mentioned child contexts' do
48
- context.append_child_context first_child
49
- context.track_visibility :private, [first_child.name]
50
- context.append_child_context second_child
51
- expect(first_child.visibility).to eq :private
52
- expect(second_child.visibility).to eq :public
53
- end
54
- end
55
- end
@@ -1,12 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/root_context'
3
-
4
- RSpec.describe Reek::Context::RootContext do
5
- describe '#full_name' do
6
- it 'reports full context' do
7
- ast = Reek::Source::SourceCode.from('foo = 1').syntax_tree
8
- root = described_class.new(ast)
9
- expect(root.full_name).to eq('')
10
- end
11
- end
12
- end
@@ -1,24 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/statement_counter'
3
-
4
- RSpec.describe Reek::Context::StatementCounter do
5
- let(:counter) { described_class.new }
6
-
7
- describe '#increase_by' do
8
- it 'does not increase if passed a falsy value' do
9
- counter.increase_by(nil)
10
- expect(counter.value).to eq 0
11
- end
12
-
13
- it 'increase by the lengh of the passed in argument' do
14
- counter.increase_by([1, 2, 3])
15
- expect(counter.value).to eq 3
16
- end
17
-
18
- it 'accumulates increases' do
19
- counter.increase_by([1, 2, 3])
20
- counter.increase_by([1, 2, 3])
21
- expect(counter.value).to eq 6
22
- end
23
- end
24
- end