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,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
@@ -1,168 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/cli/application'
3
-
4
- RSpec.describe Reek::CLI::Application do
5
- describe '#initialize' do
6
- it 'exits with default error code on invalid options' do
7
- call = lambda do
8
- Reek::CLI::Silencer.silently do
9
- described_class.new ['--foo']
10
- end
11
- end
12
- expect(&call).to raise_error(SystemExit) do |error|
13
- expect(error.status).to eq Reek::CLI::Status::DEFAULT_ERROR_EXIT_CODE
14
- end
15
- end
16
- end
17
-
18
- describe '#execute' do
19
- let(:path_excluded_in_configuration) do
20
- SAMPLES_DIR.join('source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb')
21
- end
22
- let(:configuration) { test_configuration_for(CONFIGURATION_DIR.join('with_excluded_paths.reek')) }
23
- let(:command) { instance_double 'Reek::CLI::Command::ReportCommand' }
24
- let(:app) { described_class.new [] }
25
-
26
- before do
27
- allow(Reek::CLI::Command::ReportCommand).to receive(:new).and_return command
28
- allow(command).to receive(:execute).and_return 'foo'
29
- end
30
-
31
- it "returns the command's result code" do
32
- expect(app.execute).to eq 'foo'
33
- end
34
-
35
- context 'when no source files given and input was piped' do
36
- before do
37
- allow_any_instance_of(IO).to receive(:tty?).and_return(false)
38
- end
39
-
40
- it 'uses source from pipe' do
41
- expected_sources = a_collection_containing_exactly(have_attributes(origin: 'STDIN'))
42
- app.execute
43
- expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
44
- with(sources: expected_sources,
45
- configuration: Reek::Configuration::AppConfiguration,
46
- options: Reek::CLI::Options)
47
- end
48
-
49
- context 'when a stdin filename is provided' do
50
- let(:app) { described_class.new ['--stdin-filename', 'foo.rb'] }
51
-
52
- it 'assumes that filename' do
53
- expected_sources = a_collection_containing_exactly(have_attributes(origin: 'foo.rb'))
54
- app.execute
55
- expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
56
- with(sources: expected_sources,
57
- configuration: Reek::Configuration::AppConfiguration,
58
- options: Reek::CLI::Options)
59
- end
60
- end
61
- end
62
-
63
- context 'when no source files given and no input was piped' do
64
- before do
65
- allow_any_instance_of(IO).to receive(:tty?).and_return(true)
66
- end
67
-
68
- it 'uses working directory as source' do
69
- expected_sources = Reek::Source::SourceLocator.new(['.']).sources
70
- app.execute
71
- expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
72
- with(sources: expected_sources,
73
- configuration: Reek::Configuration::AppConfiguration,
74
- options: Reek::CLI::Options)
75
- end
76
-
77
- context 'when source files are excluded through configuration' do
78
- let(:app) { described_class.new ['--config', 'some_file.reek'] }
79
-
80
- before do
81
- allow(Reek::Configuration::AppConfiguration).
82
- to receive(:from_path).
83
- with(Pathname.new('some_file.reek')).
84
- and_return configuration
85
- end
86
-
87
- it 'uses configuration for excluded paths' do
88
- expected_sources = Reek::Source::SourceLocator.
89
- new(['.'], configuration: configuration).sources
90
- expect(expected_sources).not_to include(path_excluded_in_configuration)
91
-
92
- app.execute
93
-
94
- expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
95
- with(sources: expected_sources,
96
- configuration: configuration,
97
- options: Reek::CLI::Options)
98
- end
99
- end
100
- end
101
-
102
- context 'when source files given' do
103
- let(:app) { described_class.new ['.'] }
104
-
105
- it 'uses sources from argv' do
106
- expected_sources = Reek::Source::SourceLocator.new(['.']).sources
107
- app.execute
108
- expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
109
- with(sources: expected_sources,
110
- configuration: Reek::Configuration::AppConfiguration,
111
- options: Reek::CLI::Options)
112
- end
113
-
114
- context 'when source files are excluded through configuration' do
115
- let(:app) { described_class.new ['--config', 'some_file.reek', '.'] }
116
-
117
- before do
118
- allow(Reek::Configuration::AppConfiguration).
119
- to receive(:from_path).
120
- with(Pathname.new('some_file.reek')).
121
- and_return configuration
122
- end
123
-
124
- it 'uses configuration for excluded paths' do
125
- expected_sources = Reek::Source::SourceLocator.
126
- new(['.'], configuration: configuration).sources
127
- expect(expected_sources).not_to include(path_excluded_in_configuration)
128
-
129
- app.execute
130
-
131
- expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
132
- with(sources: expected_sources,
133
- configuration: configuration,
134
- options: Reek::CLI::Options)
135
- end
136
- end
137
- end
138
- end
139
-
140
- describe 'show configuration path' do
141
- let(:app) { described_class.new ['--show-configuration-path', '.'] }
142
-
143
- around do |example|
144
- Dir.mktmpdir do |tmp|
145
- Dir.chdir(tmp) do
146
- example.run
147
- end
148
- end
149
- end
150
-
151
- context 'when not using any configuration file' do
152
- it 'prints that we are not using any configuration file' do
153
- expect do
154
- app.execute
155
- end.to output("Not using any configuration file.\n").to_stdout
156
- end
157
- end
158
-
159
- context 'with a default configuration file' do
160
- it 'prints that we are using the default configuration file' do
161
- FileUtils.touch '.reek.yml'
162
- expect do
163
- app.execute
164
- end.to output("Using '.reek.yml' as configuration file.\n").to_stdout
165
- end
166
- end
167
- end
168
- end
@@ -1,44 +0,0 @@
1
- require_relative '../../../spec_helper'
2
- require_lib 'reek/cli/command/report_command'
3
- require_lib 'reek/cli/options'
4
-
5
- RSpec.describe Reek::CLI::Command::ReportCommand do
6
- describe '#execute' do
7
- let(:options) { Reek::CLI::Options.new [] }
8
-
9
- let(:configuration) { instance_double 'Reek::Configuration::AppConfiguration' }
10
- let(:sources) { [source_file] }
11
-
12
- let(:command) do
13
- described_class.new(options: options,
14
- sources: sources,
15
- configuration: configuration)
16
- end
17
-
18
- before do
19
- allow(configuration).to receive(:directive_for).and_return({})
20
- end
21
-
22
- context 'when no smells are found' do
23
- let(:source_file) { CLEAN_FILE }
24
-
25
- it 'returns a success code' do
26
- result = Reek::CLI::Silencer.silently do
27
- command.execute
28
- end
29
- expect(result).to eq Reek::CLI::Status::DEFAULT_SUCCESS_EXIT_CODE
30
- end
31
- end
32
-
33
- context 'when smells are found' do
34
- let(:source_file) { SMELLY_FILE }
35
-
36
- it 'returns a failure code' do
37
- result = Reek::CLI::Silencer.silently do
38
- command.execute
39
- end
40
- expect(result).to eq Reek::CLI::Status::DEFAULT_FAILURE_EXIT_CODE
41
- end
42
- end
43
- end
44
- end