reek 6.0.2 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ruby.yml +58 -0
  4. data/.gitignore +0 -1
  5. data/.rubocop.yml +7 -20
  6. data/.rubocop_todo.yml +6 -4
  7. data/.simplecov +2 -0
  8. data/CHANGELOG.md +114 -0
  9. data/CONTRIBUTING.md +10 -10
  10. data/Dockerfile +1 -1
  11. data/Gemfile +17 -24
  12. data/README.md +38 -40
  13. data/Rakefile +2 -0
  14. data/bin/code_climate_reek +56 -8
  15. data/docs/yard_plugin.rb +3 -1
  16. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  17. data/lib/reek/ast/node.rb +16 -10
  18. data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
  19. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  20. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  21. data/lib/reek/ast/sexp_extensions/send.rb +22 -7
  22. data/lib/reek/cli/command/todo_list_command.rb +3 -3
  23. data/lib/reek/cli/options.rb +8 -8
  24. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
  25. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
  26. data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
  27. data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
  28. data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
  29. data/lib/reek/code_comment.rb +25 -20
  30. data/lib/reek/configuration/app_configuration.rb +5 -5
  31. data/lib/reek/configuration/configuration_converter.rb +1 -1
  32. data/lib/reek/configuration/configuration_file_finder.rb +5 -4
  33. data/lib/reek/configuration/default_directive.rb +1 -1
  34. data/lib/reek/configuration/directory_directives.rb +1 -1
  35. data/lib/reek/configuration/excluded_paths.rb +3 -2
  36. data/lib/reek/configuration/schema.rb +177 -0
  37. data/lib/reek/configuration/schema_validator.rb +12 -13
  38. data/lib/reek/context/attribute_context.rb +1 -1
  39. data/lib/reek/context/code_context.rb +3 -3
  40. data/lib/reek/context/method_context.rb +1 -1
  41. data/lib/reek/context/module_context.rb +4 -0
  42. data/lib/reek/context/refinement_context.rb +16 -0
  43. data/lib/reek/context/send_context.rb +7 -1
  44. data/lib/reek/context_builder.rb +17 -3
  45. data/lib/reek/documentation_link.rb +3 -5
  46. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
  47. data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
  48. data/lib/reek/errors/encoding_error.rb +1 -1
  49. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
  50. data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
  51. data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
  52. data/lib/reek/errors/syntax_error.rb +1 -1
  53. data/lib/reek/rake/task.rb +5 -5
  54. data/lib/reek/report/github_report.rb +55 -0
  55. data/lib/reek/report/text_report.rb +1 -1
  56. data/lib/reek/report.rb +7 -5
  57. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  58. data/lib/reek/smell_detectors/class_variable.rb +2 -2
  59. data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
  60. data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +1 -1
  61. data/lib/reek/smell_detectors/data_clump.rb +1 -1
  62. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
  63. data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
  64. data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
  65. data/lib/reek/smell_detectors/uncommunicative_module_name.rb +1 -1
  66. data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
  67. data/lib/reek/smell_warning.rb +1 -1
  68. data/lib/reek/source/source_code.rb +11 -5
  69. data/lib/reek/source/source_locator.rb +1 -3
  70. data/lib/reek/spec/should_reek_of.rb +11 -9
  71. data/lib/reek/spec.rb +1 -1
  72. data/lib/reek/version.rb +2 -2
  73. data/reek.gemspec +33 -25
  74. metadata +41 -238
  75. data/.travis.yml +0 -40
  76. data/docs/API.md +0 -174
  77. data/docs/Attribute.md +0 -39
  78. data/docs/Basic-Smell-Options.md +0 -85
  79. data/docs/Boolean-Parameter.md +0 -54
  80. data/docs/Class-Variable.md +0 -40
  81. data/docs/Code-Smells.md +0 -39
  82. data/docs/Command-Line-Options.md +0 -119
  83. data/docs/Control-Couple.md +0 -26
  84. data/docs/Control-Parameter.md +0 -32
  85. data/docs/Data-Clump.md +0 -46
  86. data/docs/Duplicate-Method-Call.md +0 -264
  87. data/docs/Feature-Envy.md +0 -93
  88. data/docs/How-To-Write-New-Detectors.md +0 -132
  89. data/docs/How-reek-works-internally.md +0 -114
  90. data/docs/Instance-Variable-Assumption.md +0 -163
  91. data/docs/Irresponsible-Module.md +0 -47
  92. data/docs/Large-Class.md +0 -16
  93. data/docs/Long-Parameter-List.md +0 -39
  94. data/docs/Long-Yield-List.md +0 -37
  95. data/docs/Manual-Dispatch.md +0 -30
  96. data/docs/Missing-Safe-Method.md +0 -92
  97. data/docs/Module-Initialize.md +0 -62
  98. data/docs/Nested-Iterators.md +0 -59
  99. data/docs/Nil-Check.md +0 -47
  100. data/docs/RSpec-matchers.md +0 -129
  101. data/docs/Rake-Task.md +0 -66
  102. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  103. data/docs/Reek-Driven-Development.md +0 -46
  104. data/docs/Repeated-Conditional.md +0 -47
  105. data/docs/Simulated-Polymorphism.md +0 -16
  106. data/docs/Smell-Suppression.md +0 -96
  107. data/docs/Style-Guide.md +0 -19
  108. data/docs/Subclassed-From-Core-Class.md +0 -79
  109. data/docs/Too-Many-Constants.md +0 -37
  110. data/docs/Too-Many-Instance-Variables.md +0 -43
  111. data/docs/Too-Many-Methods.md +0 -56
  112. data/docs/Too-Many-Statements.md +0 -54
  113. data/docs/Uncommunicative-Method-Name.md +0 -94
  114. data/docs/Uncommunicative-Module-Name.md +0 -92
  115. data/docs/Uncommunicative-Name.md +0 -18
  116. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  117. data/docs/Uncommunicative-Variable-Name.md +0 -96
  118. data/docs/Unused-Parameters.md +0 -28
  119. data/docs/Unused-Private-Method.md +0 -101
  120. data/docs/Utility-Function.md +0 -56
  121. data/docs/Versioning-Policy.md +0 -7
  122. data/docs/YAML-Reports.md +0 -93
  123. data/docs/defaults.reek.yml +0 -129
  124. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  125. data/docs/templates/default/docstring/setup.rb +0 -37
  126. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  127. data/features/command_line_interface/basic_usage.feature +0 -15
  128. data/features/command_line_interface/options.feature +0 -123
  129. data/features/command_line_interface/show_progress.feature +0 -33
  130. data/features/command_line_interface/smell_selection.feature +0 -15
  131. data/features/command_line_interface/smells_count.feature +0 -38
  132. data/features/command_line_interface/stdin.feature +0 -65
  133. data/features/configuration_files/accept_setting.feature +0 -87
  134. data/features/configuration_files/directory_specific_directives.feature +0 -274
  135. data/features/configuration_files/exclude_directives.feature +0 -35
  136. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  137. data/features/configuration_files/masking_smells.feature +0 -94
  138. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  139. data/features/configuration_files/reject_setting.feature +0 -89
  140. data/features/configuration_files/schema_validation.feature +0 -59
  141. data/features/configuration_files/show_configuration_file.feature +0 -44
  142. data/features/configuration_files/unused_private_method.feature +0 -68
  143. data/features/configuration_loading.feature +0 -91
  144. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  145. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  146. data/features/locales.feature +0 -32
  147. data/features/programmatic_access.feature +0 -41
  148. data/features/rake_task/rake_task.feature +0 -138
  149. data/features/reports/codeclimate.feature +0 -59
  150. data/features/reports/json.feature +0 -59
  151. data/features/reports/reports.feature +0 -219
  152. data/features/reports/yaml.feature +0 -52
  153. data/features/rspec_matcher.feature +0 -41
  154. data/features/samples.feature +0 -305
  155. data/features/step_definitions/.rubocop.yml +0 -5
  156. data/features/step_definitions/reek_steps.rb +0 -102
  157. data/features/step_definitions/sample_file_steps.rb +0 -63
  158. data/features/support/env.rb +0 -33
  159. data/features/todo_list.feature +0 -108
  160. data/lib/reek/configuration/schema.yml +0 -210
  161. data/samples/checkstyle.xml +0 -7
  162. data/samples/clean_source/clean.rb +0 -6
  163. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  164. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  165. data/samples/configuration/corrupt.reek +0 -1
  166. data/samples/configuration/empty.reek +0 -0
  167. data/samples/configuration/full_configuration.reek +0 -13
  168. data/samples/configuration/full_mask.reek +0 -6
  169. data/samples/configuration/home/home.reek.yml +0 -4
  170. data/samples/configuration/partial_mask.reek +0 -4
  171. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  172. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  173. data/samples/configuration/with_excluded_paths.reek +0 -5
  174. data/samples/no_config_file/.keep +0 -0
  175. data/samples/paths.rb +0 -5
  176. data/samples/smelly_source/inline.rb +0 -704
  177. data/samples/smelly_source/optparse.rb +0 -1788
  178. data/samples/smelly_source/redcloth.rb +0 -1130
  179. data/samples/smelly_source/ruby.rb +0 -368
  180. data/samples/smelly_source/smelly.rb +0 -7
  181. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  182. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  183. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  184. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  185. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  186. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  187. data/samples/source_with_non_ruby_files/gibberish +0 -1
  188. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  189. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  190. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  191. data/spec/quality/documentation_spec.rb +0 -41
  192. data/spec/quality/reek_source_spec.rb +0 -11
  193. data/spec/reek/ast/node_spec.rb +0 -211
  194. data/spec/reek/ast/object_refs_spec.rb +0 -83
  195. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  196. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  197. data/spec/reek/cli/application_spec.rb +0 -168
  198. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  199. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  200. data/spec/reek/cli/options_spec.rb +0 -51
  201. data/spec/reek/cli/silencer_spec.rb +0 -28
  202. data/spec/reek/code_comment_spec.rb +0 -184
  203. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  204. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  205. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  206. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  207. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  208. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  209. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  210. data/spec/reek/context/code_context_spec.rb +0 -192
  211. data/spec/reek/context/ghost_context_spec.rb +0 -60
  212. data/spec/reek/context/method_context_spec.rb +0 -72
  213. data/spec/reek/context/module_context_spec.rb +0 -55
  214. data/spec/reek/context/root_context_spec.rb +0 -12
  215. data/spec/reek/context/statement_counter_spec.rb +0 -24
  216. data/spec/reek/context_builder_spec.rb +0 -457
  217. data/spec/reek/detector_repository_spec.rb +0 -22
  218. data/spec/reek/documentation_link_spec.rb +0 -20
  219. data/spec/reek/errors/base_error_spec.rb +0 -13
  220. data/spec/reek/examiner_spec.rb +0 -309
  221. data/spec/reek/logging_error_handler_spec.rb +0 -24
  222. data/spec/reek/rake/task_spec.rb +0 -56
  223. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  224. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  225. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  226. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  227. data/spec/reek/report/html_report_spec.rb +0 -19
  228. data/spec/reek/report/json_report_spec.rb +0 -58
  229. data/spec/reek/report/location_formatter_spec.rb +0 -32
  230. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  231. data/spec/reek/report/text_report_spec.rb +0 -89
  232. data/spec/reek/report/xml_report_spec.rb +0 -24
  233. data/spec/reek/report/yaml_report_spec.rb +0 -55
  234. data/spec/reek/report_spec.rb +0 -28
  235. data/spec/reek/smell_configuration_spec.rb +0 -56
  236. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  237. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  238. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  239. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  240. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  241. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  242. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  243. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  244. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  245. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  246. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  247. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  248. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  249. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  250. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  251. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  252. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  253. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  254. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  255. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  256. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  257. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  258. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  259. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  260. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  261. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  262. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  263. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  264. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  265. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  266. data/spec/reek/smell_warning_spec.rb +0 -137
  267. data/spec/reek/source/source_code_spec.rb +0 -79
  268. data/spec/reek/source/source_locator_spec.rb +0 -166
  269. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  270. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  271. data/spec/reek/spec/should_reek_spec.rb +0 -52
  272. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  273. data/spec/reek/tree_dresser_spec.rb +0 -46
  274. data/spec/spec_helper.rb +0 -110
  275. data/tasks/configuration.rake +0 -18
  276. data/tasks/console.rake +0 -5
  277. data/tasks/reek.rake +0 -6
  278. data/tasks/rubocop.rake +0 -11
  279. data/tasks/test.rake +0 -32
  280. /data/lib/reek/{report/code_climate.rb → code_climate.rb} +0 -0
@@ -1,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