reek 6.0.2 → 6.0.4

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