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