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,230 +0,0 @@
1
- require 'fileutils'
2
- require 'pathname'
3
- require 'tmpdir'
4
- require_relative '../../spec_helper'
5
- require_lib 'reek/configuration/app_configuration'
6
-
7
- RSpec.describe Reek::Configuration::ConfigurationFileFinder do
8
- describe '.find' do
9
- let(:regular_configuration_dir) { CONFIGURATION_DIR.join('regular_configuration') }
10
- let(:regular_configuration_file) { regular_configuration_dir.join('.reek.yml') }
11
-
12
- it 'returns any explicitely passed path' do
13
- path = Pathname.new 'foo/bar'
14
- found = described_class.find(path: path)
15
- expect(found).to eq(path)
16
- end
17
-
18
- it 'prefers an explicitely passed path over a file in current dir' do
19
- path = Pathname.new 'foo/bar'
20
- found = described_class.find(path: path, current: regular_configuration_dir)
21
- expect(found).to eq(path)
22
- end
23
-
24
- it 'returns the file in current dir if path is not set' do
25
- found = described_class.find(current: regular_configuration_dir)
26
- expect(found).to eq(regular_configuration_file)
27
- end
28
-
29
- it 'returns the file in a parent dir if none in current dir' do
30
- empty_sub_directory = CONFIGURATION_DIR.join('regular_configuration').join('empty_sub_directory')
31
- found = described_class.find(current: empty_sub_directory)
32
- expect(found).to eq(regular_configuration_file)
33
- end
34
-
35
- it 'skips files ending in .reek.yml in current dir' do
36
- skip_if_a_config_in_tempdir
37
-
38
- Dir.mktmpdir do |tempdir|
39
- current = Pathname.new(tempdir)
40
- bad_config = current.join('ignoreme.reek.yml')
41
- FileUtils.touch bad_config
42
- found = described_class.find(current: current)
43
- expect(found).to be_nil
44
- end
45
- end
46
-
47
- it 'returns the file in home if traversing from the current dir fails' do
48
- skip_if_a_config_in_tempdir
49
-
50
- Dir.mktmpdir do |tempdir|
51
- found = described_class.find(current: Pathname.new(tempdir), home: regular_configuration_dir)
52
- expect(found).to eq(regular_configuration_file)
53
- end
54
- end
55
-
56
- it 'prefers the file in :current over one in :home' do
57
- home_dir = CONFIGURATION_DIR.join('home')
58
- found = described_class.find(current: regular_configuration_dir, home: home_dir)
59
- expect(found).to eq(regular_configuration_file)
60
- end
61
-
62
- it 'returns nil when there are no files to find' do
63
- skip_if_a_config_in_tempdir
64
-
65
- Dir.mktmpdir do |tempdir|
66
- current = Pathname.new(tempdir)
67
- home = Pathname.new(tempdir)
68
-
69
- found = described_class.find(current: current, home: home)
70
-
71
- expect(found).to be_nil
72
- end
73
- end
74
-
75
- it 'does not traverse up from :home' do
76
- skip_if_a_config_in_tempdir
77
-
78
- Dir.mktmpdir do |tempdir|
79
- current = Pathname.new(tempdir)
80
- home = SAMPLES_DIR.join('no_config_file')
81
-
82
- found = described_class.find(current: current, home: home)
83
-
84
- expect(found).to be_nil
85
- end
86
- end
87
-
88
- it 'works with paths that need escaping' do
89
- Dir.mktmpdir("ma\ngic d*r") do |tempdir|
90
- config = Pathname.new("#{tempdir}/.reek.yml")
91
- subdir = Pathname.new("#{tempdir}/ma\ngic subd*r")
92
- FileUtils.touch config
93
- FileUtils.mkdir subdir
94
- found = described_class.find(current: subdir)
95
- expect(found).to eq(config)
96
- end
97
- end
98
- end
99
-
100
- describe '.load_from_file' do
101
- let(:sample_configuration_loaded) do
102
- {
103
- Reek::DETECTORS_KEY => {
104
- 'UncommunicativeVariableName' => { 'enabled' => false },
105
- 'UncommunicativeMethodName' => { 'enabled' => false }
106
- }
107
- }
108
- end
109
-
110
- it 'loads the configuration from given file' do
111
- configuration = described_class.load_from_file(CONFIGURATION_DIR.join('full_mask.reek'))
112
- expect(configuration).to eq(sample_configuration_loaded)
113
- end
114
-
115
- it 'raises an error if it can not find the given file' do
116
- Dir.mktmpdir do |tempdir|
117
- path = Pathname.new(tempdir).join('does_not_exist.reek')
118
- expect { described_class.load_from_file(path) }.
119
- to raise_error(Reek::Errors::ConfigFileError, /Invalid configuration file/)
120
- end
121
- end
122
-
123
- context 'with exclude, accept and reject settings' do
124
- context 'when configuring top level detectors' do
125
- let(:configuration) do
126
- described_class.
127
- load_from_file(CONFIGURATION_DIR.join('accepts_rejects_and_excludes_for_detectors.reek.yml')).
128
- fetch(Reek::DETECTORS_KEY)
129
- end
130
-
131
- let(:expected) do
132
- {
133
- 'UnusedPrivateMethod' => { 'exclude' => [/exclude regexp/] },
134
- 'UncommunicativeMethodName' => { 'reject' => ['reject name'],
135
- 'accept' => ['accept name'] },
136
- 'UncommunicativeModuleName' => { 'reject' => ['reject name 1', 'reject name 2'],
137
- 'accept' => ['accept name 1', 'accept name 2'] },
138
- 'UncommunicativeParameterName' => { 'reject' => ['reject name', /reject regexp/],
139
- 'accept' => ['accept name', /accept regexp/] },
140
- 'UncommunicativeVariableName' => { 'reject' => [/^reject regexp$/],
141
- 'accept' => [/accept(.*)regexp/] }
142
- }
143
- end
144
-
145
- it 'converts marked strings to regexes' do
146
- expect(configuration['UnusedPrivateMethod']).to eq(expected['UnusedPrivateMethod'])
147
- end
148
-
149
- it 'leaves regular single strings untouched' do
150
- expect(configuration['UncommunicativeMethodName']).to eq(expected['UncommunicativeMethodName'])
151
- end
152
-
153
- it 'leaves regular multiple strings untouched' do
154
- expect(configuration['UncommunicativeModuleName']).to eq(expected['UncommunicativeModuleName'])
155
- end
156
-
157
- it 'allows mixing of regular strings and marked strings' do
158
- expect(configuration['UncommunicativeParameterName']).to eq(expected['UncommunicativeParameterName'])
159
- end
160
-
161
- it 'converts more complex marked strings correctly to regexes' do
162
- expect(configuration['UncommunicativeVariableName']).to eq(expected['UncommunicativeVariableName'])
163
- end
164
- end
165
-
166
- context 'when configuring directory directives' do
167
- let(:directory_name) { 'app/controllers' }
168
- let(:configuration) do
169
- described_class.
170
- load_from_file(CONFIGURATION_DIR.join('accepts_rejects_and_excludes_for_directory_directives.reek.yml')).
171
- fetch(Reek::DIRECTORIES_KEY)
172
- end
173
-
174
- let(:expected) do
175
- {
176
- directory_name => {
177
- 'UnusedPrivateMethod' => { 'exclude' => [/exclude regexp/] },
178
- 'UncommunicativeMethodName' => { 'reject' => ['reject name'],
179
- 'accept' => ['accept name'] },
180
- 'UncommunicativeModuleName' => { 'reject' => ['reject name 1', 'reject name 2'],
181
- 'accept' => ['accept name 1', 'accept name 2'] },
182
- 'UncommunicativeParameterName' => { 'reject' => ['reject name', /reject regexp/],
183
- 'accept' => ['accept name', /accept regexp/] },
184
- 'UncommunicativeVariableName' => { 'reject' => [/^reject regexp$/],
185
- 'accept' => [/accept(.*)regexp/] }
186
- }
187
- }
188
- end
189
-
190
- it 'converts marked strings to regexes' do
191
- expect(configuration[directory_name]['UnusedPrivateMethod']).
192
- to eq(expected[directory_name]['UnusedPrivateMethod'])
193
- end
194
-
195
- it 'leaves regular single strings untouched' do
196
- expect(configuration[directory_name]['UncommunicativeMethodName']).
197
- to eq(expected[directory_name]['UncommunicativeMethodName'])
198
- end
199
-
200
- it 'leaves regular multiple strings untouched' do
201
- expect(configuration[directory_name]['UncommunicativeModuleName']).
202
- to eq(expected[directory_name]['UncommunicativeModuleName'])
203
- end
204
-
205
- it 'allows mixing of regular strings and marked strings' do
206
- expect(configuration[directory_name]['UncommunicativeParameterName']).
207
- to eq(expected[directory_name]['UncommunicativeParameterName'])
208
- end
209
-
210
- it 'converts more complex marked strings correctly to regexes' do
211
- expect(configuration[directory_name]['UncommunicativeVariableName']).
212
- to eq(expected[directory_name]['UncommunicativeVariableName'])
213
- end
214
- end
215
- end
216
-
217
- it 'returns blank hash when no file is found' do
218
- config = described_class.load_from_file(nil)
219
-
220
- expect(config).to eq({})
221
- end
222
- end
223
-
224
- private
225
-
226
- def skip_if_a_config_in_tempdir
227
- found = described_class.find(current: Pathname.new(Dir.tmpdir))
228
- skip "skipped: #{found} exists and would fail this test" if found
229
- end
230
- end
@@ -1,13 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/configuration/default_directive'
3
-
4
- RSpec.describe Reek::Configuration::DefaultDirective do
5
- describe '#add' do
6
- let(:directives) { {}.extend(described_class) }
7
-
8
- it 'adds a smell configuration' do
9
- directives.add(UncommunicativeVariableName: { enabled: false })
10
- expect(directives).to eq(Reek::SmellDetectors::UncommunicativeVariableName => { enabled: false })
11
- end
12
- end
13
- end
@@ -1,122 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/errors/config_file_error'
3
- require_lib 'reek/configuration/directory_directives'
4
-
5
- RSpec.describe Reek::Configuration::DirectoryDirectives do
6
- describe '#directive_for' do
7
- let(:baz_config) { { Reek::SmellDetectors::IrresponsibleModule => { enabled: false } } }
8
- let(:bang_config) { { Reek::SmellDetectors::Attribute => { enabled: true } } }
9
- let(:directives) do
10
- {
11
- Pathname.new('foo/bar/baz') => baz_config,
12
- Pathname.new('foo/bar/bang') => bang_config
13
- }.extend(described_class)
14
- end
15
- let(:source_via) { 'foo/bar/bang/dummy.rb' }
16
-
17
- context 'when our source is in a directory for which we have a directive' do
18
- it 'returns the corresponding directive' do
19
- expect(directives.directive_for(source_via)).to eq(bang_config)
20
- end
21
- end
22
-
23
- context 'when our source is not in a directory for which we have a directive' do
24
- it 'returns nil' do
25
- expect(directives.directive_for('does/not/exist')).to eq(nil)
26
- end
27
- end
28
- end
29
-
30
- describe '#add' do
31
- let(:directives) do
32
- {}.extend(described_class)
33
- end
34
-
35
- context 'when one of given paths is a file' do
36
- let(:file_as_path) { SAMPLES_DIR.join('smelly_source').join('inline.rb') }
37
-
38
- it 'raises an error' do
39
- expect { directives.add(file_as_path => nil) }.to raise_error(Reek::Errors::ConfigFileError)
40
- end
41
- end
42
- end
43
-
44
- describe '#best_match_for' do
45
- let(:directives) do
46
- {
47
- Pathname.new('foo/bar/baz') => {},
48
- Pathname.new('foo/bar') => {},
49
- Pathname.new('bar/boo') => {},
50
- Pathname.new('bar/**/test/**') => {},
51
- Pathname.new('bar/**/spec/*') => {},
52
- Pathname.new('bar/**/.spec/*') => {}
53
- }.extend(described_class)
54
- end
55
-
56
- it 'returns the corresponding directory when source_base_dir is a leaf' do
57
- source_base_dir = 'foo/bar/baz/bang'
58
- hit = directives.send :best_match_for, source_base_dir
59
- expect(hit.to_s).to eq('foo/bar/baz')
60
- end
61
-
62
- it 'returns the corresponding directory when source_base_dir is in the middle of the tree' do
63
- source_base_dir = 'foo/bar'
64
- hit = directives.send :best_match_for, source_base_dir
65
- expect(hit.to_s).to eq('foo/bar')
66
- end
67
-
68
- it 'returns the corresponding directory when source_base_dir matches the Dir.glob like pattern' do
69
- source_base_dir = 'bar/something/test'
70
- hit = directives.send :best_match_for, source_base_dir
71
- expect(hit.to_s).to eq('bar/**/test/**')
72
- end
73
-
74
- it 'returns the corresponding directory when source_base_dir is a leaf of the Dir.glob like pattern' do
75
- source_base_dir = 'bar/something/test/with/some/subdirectory'
76
- hit = directives.send :best_match_for, source_base_dir
77
- expect(hit.to_s).to eq('bar/**/test/**')
78
- end
79
-
80
- it 'returns the corresponding directory when source_base_dir is a direct leaf of the Dir.glob like pattern' do
81
- source_base_dir = 'bar/something/spec/direct'
82
- hit = directives.send :best_match_for, source_base_dir
83
- expect(hit.to_s).to eq('bar/**/spec/*')
84
- end
85
-
86
- it 'returns the corresponding directory when source_base_dir contains a . character' do
87
- source_base_dir = 'bar/something/.spec/direct'
88
- hit = directives.send :best_match_for, source_base_dir
89
- expect(hit.to_s).to eq('bar/**/.spec/*')
90
- end
91
-
92
- it 'returns the corresponding directory when source_base_dir is an absolute_path' do
93
- source_base_dir = Pathname.new('foo/bar').expand_path
94
- hit = directives.send :best_match_for, source_base_dir
95
- expect(hit.to_s).to eq('foo/bar')
96
- end
97
-
98
- it 'does not match an arbitrary directory when source_base_dir contains a character that could match the .' do
99
- source_base_dir = 'bar/something/aspec/direct'
100
- hit = directives.send :best_match_for, source_base_dir
101
- expect(hit.to_s).to eq('')
102
- end
103
-
104
- it 'returns nil when source_base_dir is a not direct leaf of the Dir.glob one-folder pattern' do
105
- source_base_dir = 'bar/something/spec/with/some/subdirectory'
106
- hit = directives.send :best_match_for, source_base_dir
107
- expect(hit).to be_nil
108
- end
109
-
110
- it 'returns nil we are on top of the tree and all other directories are below' do
111
- source_base_dir = 'foo'
112
- hit = directives.send :best_match_for, source_base_dir
113
- expect(hit).to be_nil
114
- end
115
-
116
- it 'returns nil when source_base_dir is not part of any directory directive at all' do
117
- source_base_dir = 'non/existent'
118
- hit = directives.send :best_match_for, source_base_dir
119
- expect(hit).to be_nil
120
- end
121
- end
122
- end
@@ -1,16 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/errors/config_file_error'
3
- require_lib 'reek/configuration/excluded_paths'
4
-
5
- RSpec.describe Reek::Configuration::ExcludedPaths do
6
- describe '#add' do
7
- let(:exclusions) { [].extend(described_class) }
8
- let(:paths) { ['smelly/sources'] }
9
- let(:expected_exclude_paths) { [Pathname('smelly/sources')] }
10
-
11
- it 'adds the given paths as Pathname' do
12
- exclusions.add(paths)
13
- expect(exclusions).to eq expected_exclude_paths
14
- end
15
- end
16
- end
@@ -1,33 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/configuration/rake_task_converter'
3
-
4
- RSpec.describe Reek::Configuration::RakeTaskConverter do
5
- describe 'convert' do
6
- let(:configuration_for_smell_detector) do
7
- {
8
- 'exclude' => [/Klass#foobar$/, /^Klass#omg$/],
9
- 'reject' => [/^[a-z]$/, /[0-9]$/, /[A-Z]/],
10
- 'accept' => [/^_$/]
11
- }
12
- end
13
-
14
- let(:expected_exclude) { ['/Klass#foobar$/', '/^Klass#omg$/'] }
15
- let(:expected_reject) { ['/^[a-z]$/', '/[0-9]$/', '/[A-Z]/'] }
16
- let(:expected_accept) { ['/^_$/'] }
17
-
18
- it 'converts exclude regexes to strings' do
19
- converted_configuration = described_class.convert configuration_for_smell_detector
20
- expect(converted_configuration['exclude']).to eq(expected_exclude)
21
- end
22
-
23
- it 'converts reject regexes to strings' do
24
- converted_configuration = described_class.convert configuration_for_smell_detector
25
- expect(converted_configuration['reject']).to eq(expected_reject)
26
- end
27
-
28
- it 'converts accept regexes to strings' do
29
- converted_configuration = described_class.convert configuration_for_smell_detector
30
- expect(converted_configuration['accept']).to eq(expected_accept)
31
- end
32
- end
33
- end
@@ -1,165 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/configuration/schema_validator'
3
- require_lib 'reek/errors/config_file_error'
4
-
5
- RSpec.describe Reek::Configuration::SchemaValidator do
6
- describe 'validate' do
7
- subject(:validator) { described_class.new configuration }
8
-
9
- context 'when configuration is valid' do
10
- let(:configuration) do
11
- {
12
- Reek::DETECTORS_KEY => {
13
- 'UncommunicativeVariableName' => { 'enabled' => false },
14
- 'UncommunicativeMethodName' => { 'enabled' => false }
15
- }
16
- }
17
- end
18
-
19
- it 'returns nil' do
20
- expect(validator.validate).to eq(nil)
21
- end
22
- end
23
-
24
- context 'when detector is invalid' do
25
- let(:configuration) do
26
- {
27
- Reek::DETECTORS_KEY => {
28
- 'DoesNotExist' => { 'enabled' => false }
29
- }
30
- }
31
- end
32
-
33
- it 'raises an error' do
34
- message = %r{\[/detectors/DoesNotExist\] key 'DoesNotExist:' is undefined}
35
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
36
- end
37
- end
38
-
39
- context 'when `enabled` has a non-boolean value' do
40
- let(:configuration) do
41
- {
42
- Reek::DETECTORS_KEY => {
43
- 'FeatureEnvy' => { 'enabled' => 'foo' }
44
- }
45
- }
46
- end
47
-
48
- it 'raises an error' do
49
- message = %r{\[/detectors/FeatureEnvy/enabled\] 'foo': not a boolean}
50
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
51
- end
52
- end
53
-
54
- context 'when detector has an unknown option' do
55
- let(:configuration) do
56
- {
57
- Reek::DETECTORS_KEY => {
58
- 'DataClump' => { 'does_not_exist' => 42 }
59
- }
60
- }
61
- end
62
-
63
- it 'raises an error' do
64
- message = %r{\[/detectors/DataClump/does_not_exist\] key 'does_not_exist:' is undefined}
65
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
66
- end
67
- end
68
-
69
- context 'when `exclude`, `reject` and `accept`' do
70
- %w(exclude reject accept).each do |attribute|
71
- context 'when a scalar' do
72
- let(:configuration) do
73
- {
74
- Reek::DETECTORS_KEY => {
75
- 'UncommunicativeMethodName' => { attribute => 42 }
76
- }
77
- }
78
- end
79
-
80
- it 'raises an error' do
81
- message = %r{\[/detectors/UncommunicativeMethodName/#{attribute}\] '42': not a sequence}
82
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
83
- end
84
- end
85
-
86
- context 'when types are mixed' do
87
- let(:configuration) do
88
- {
89
- Reek::DETECTORS_KEY => {
90
- 'UncommunicativeMethodName' => { attribute => [42, 'foo'] }
91
- }
92
- }
93
- end
94
-
95
- it 'raises an error' do
96
- message = %r{\[/detectors/UncommunicativeMethodName/#{attribute}/0\] '42': not a string}
97
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
98
- end
99
- end
100
- end
101
- end
102
-
103
- context 'when `exclude_paths` is a scalar' do
104
- let(:configuration) do
105
- {
106
- Reek::EXCLUDE_PATHS_KEY => 42
107
- }
108
- end
109
-
110
- it 'raises an error' do
111
- message = %r{\[/exclude_paths\] '42': not a sequence}
112
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
113
- end
114
- end
115
-
116
- context 'when `exclude_paths` mixes types' do
117
- let(:configuration) do
118
- {
119
- Reek::EXCLUDE_PATHS_KEY => [42, 'foo']
120
- }
121
- end
122
-
123
- it 'raises an error' do
124
- message = %r{\[/exclude_paths/0\] '42': not a string}
125
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
126
- end
127
- end
128
-
129
- context 'with directory directives' do
130
- context 'when bad detector' do
131
- let(:configuration) do
132
- {
133
- Reek::DIRECTORIES_KEY => {
134
- 'web_app/app/helpers' => {
135
- 'Bar' => { 'enabled' => false }
136
- }
137
- }
138
- }
139
- end
140
-
141
- it 'raises an error' do
142
- message = %r{\[/directories/web_app/app/helpers/Bar\] key 'Bar:' is undefined}
143
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
144
- end
145
- end
146
-
147
- context 'when unknown attribute' do
148
- let(:configuration) do
149
- {
150
- Reek::DIRECTORIES_KEY => {
151
- 'web_app/app/controllers' => {
152
- 'NestedIterators' => { 'foo' => false }
153
- }
154
- }
155
- }
156
- end
157
-
158
- it 'raises an error' do
159
- message = %r{\[/directories/web_app/app/controllers/NestedIterators/foo\] key 'foo:' is undefined}
160
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
161
- end
162
- end
163
- end
164
- end
165
- end