reek 6.0.3 → 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 (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/CONTRIBUTING.md +3 -0
  4. data/Dockerfile +1 -1
  5. data/Gemfile +6 -6
  6. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  7. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  8. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  9. data/lib/reek/smell_warning.rb +1 -1
  10. data/lib/reek/source/source_locator.rb +1 -3
  11. data/lib/reek/version.rb +1 -1
  12. data/reek.gemspec +4 -1
  13. metadata +3 -208
  14. data/docs/API.md +0 -174
  15. data/docs/Attribute.md +0 -39
  16. data/docs/Basic-Smell-Options.md +0 -85
  17. data/docs/Boolean-Parameter.md +0 -54
  18. data/docs/Class-Variable.md +0 -40
  19. data/docs/Code-Smells.md +0 -39
  20. data/docs/Command-Line-Options.md +0 -119
  21. data/docs/Control-Couple.md +0 -26
  22. data/docs/Control-Parameter.md +0 -32
  23. data/docs/Data-Clump.md +0 -46
  24. data/docs/Duplicate-Method-Call.md +0 -264
  25. data/docs/Feature-Envy.md +0 -93
  26. data/docs/How-To-Write-New-Detectors.md +0 -132
  27. data/docs/How-reek-works-internally.md +0 -114
  28. data/docs/Instance-Variable-Assumption.md +0 -163
  29. data/docs/Irresponsible-Module.md +0 -47
  30. data/docs/Large-Class.md +0 -16
  31. data/docs/Long-Parameter-List.md +0 -39
  32. data/docs/Long-Yield-List.md +0 -37
  33. data/docs/Manual-Dispatch.md +0 -30
  34. data/docs/Missing-Safe-Method.md +0 -92
  35. data/docs/Module-Initialize.md +0 -62
  36. data/docs/Nested-Iterators.md +0 -59
  37. data/docs/Nil-Check.md +0 -47
  38. data/docs/RSpec-matchers.md +0 -129
  39. data/docs/Rake-Task.md +0 -66
  40. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  41. data/docs/Reek-Driven-Development.md +0 -46
  42. data/docs/Repeated-Conditional.md +0 -47
  43. data/docs/Simulated-Polymorphism.md +0 -16
  44. data/docs/Smell-Suppression.md +0 -96
  45. data/docs/Style-Guide.md +0 -19
  46. data/docs/Subclassed-From-Core-Class.md +0 -79
  47. data/docs/Too-Many-Constants.md +0 -37
  48. data/docs/Too-Many-Instance-Variables.md +0 -43
  49. data/docs/Too-Many-Methods.md +0 -56
  50. data/docs/Too-Many-Statements.md +0 -54
  51. data/docs/Uncommunicative-Method-Name.md +0 -94
  52. data/docs/Uncommunicative-Module-Name.md +0 -92
  53. data/docs/Uncommunicative-Name.md +0 -18
  54. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  55. data/docs/Uncommunicative-Variable-Name.md +0 -96
  56. data/docs/Unused-Parameters.md +0 -28
  57. data/docs/Unused-Private-Method.md +0 -101
  58. data/docs/Utility-Function.md +0 -56
  59. data/docs/Versioning-Policy.md +0 -7
  60. data/docs/YAML-Reports.md +0 -93
  61. data/docs/defaults.reek.yml +0 -129
  62. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  63. data/docs/templates/default/docstring/setup.rb +0 -35
  64. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  65. data/docs/yard_plugin.rb +0 -17
  66. data/features/command_line_interface/basic_usage.feature +0 -15
  67. data/features/command_line_interface/options.feature +0 -123
  68. data/features/command_line_interface/show_progress.feature +0 -33
  69. data/features/command_line_interface/smell_selection.feature +0 -15
  70. data/features/command_line_interface/smells_count.feature +0 -38
  71. data/features/command_line_interface/stdin.feature +0 -65
  72. data/features/configuration_files/accept_setting.feature +0 -87
  73. data/features/configuration_files/directory_specific_directives.feature +0 -274
  74. data/features/configuration_files/exclude_directives.feature +0 -35
  75. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  76. data/features/configuration_files/masking_smells.feature +0 -94
  77. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  78. data/features/configuration_files/reject_setting.feature +0 -89
  79. data/features/configuration_files/schema_validation.feature +0 -59
  80. data/features/configuration_files/show_configuration_file.feature +0 -44
  81. data/features/configuration_files/unused_private_method.feature +0 -68
  82. data/features/configuration_loading.feature +0 -91
  83. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  84. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  85. data/features/locales.feature +0 -32
  86. data/features/programmatic_access.feature +0 -41
  87. data/features/rake_task/rake_task.feature +0 -138
  88. data/features/reports/codeclimate.feature +0 -59
  89. data/features/reports/json.feature +0 -59
  90. data/features/reports/reports.feature +0 -219
  91. data/features/reports/yaml.feature +0 -52
  92. data/features/rspec_matcher.feature +0 -41
  93. data/features/samples.feature +0 -305
  94. data/features/step_definitions/.rubocop.yml +0 -5
  95. data/features/step_definitions/reek_steps.rb +0 -102
  96. data/features/step_definitions/sample_file_steps.rb +0 -63
  97. data/features/support/env.rb +0 -33
  98. data/features/todo_list.feature +0 -108
  99. data/samples/checkstyle.xml +0 -7
  100. data/samples/clean_source/clean.rb +0 -6
  101. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  102. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  103. data/samples/configuration/corrupt.reek +0 -1
  104. data/samples/configuration/empty.reek +0 -0
  105. data/samples/configuration/full_configuration.reek +0 -13
  106. data/samples/configuration/full_mask.reek +0 -6
  107. data/samples/configuration/home/home.reek.yml +0 -4
  108. data/samples/configuration/partial_mask.reek +0 -4
  109. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  110. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  111. data/samples/configuration/with_excluded_paths.reek +0 -5
  112. data/samples/no_config_file/.keep +0 -0
  113. data/samples/paths.rb +0 -5
  114. data/samples/smelly_source/inline.rb +0 -704
  115. data/samples/smelly_source/optparse.rb +0 -1788
  116. data/samples/smelly_source/redcloth.rb +0 -1130
  117. data/samples/smelly_source/ruby.rb +0 -368
  118. data/samples/smelly_source/smelly.rb +0 -7
  119. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  120. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  121. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  122. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  123. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  124. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  125. data/samples/source_with_non_ruby_files/gibberish +0 -1
  126. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  127. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  128. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  129. data/spec/quality/documentation_spec.rb +0 -41
  130. data/spec/quality/reek_source_spec.rb +0 -11
  131. data/spec/reek/ast/node_spec.rb +0 -211
  132. data/spec/reek/ast/object_refs_spec.rb +0 -83
  133. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  134. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  135. data/spec/reek/cli/application_spec.rb +0 -168
  136. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  137. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  138. data/spec/reek/cli/options_spec.rb +0 -51
  139. data/spec/reek/cli/silencer_spec.rb +0 -28
  140. data/spec/reek/code_comment_spec.rb +0 -184
  141. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  142. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  143. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  144. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  145. data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
  146. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  147. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  148. data/spec/reek/context/code_context_spec.rb +0 -192
  149. data/spec/reek/context/ghost_context_spec.rb +0 -60
  150. data/spec/reek/context/method_context_spec.rb +0 -72
  151. data/spec/reek/context/module_context_spec.rb +0 -55
  152. data/spec/reek/context/root_context_spec.rb +0 -12
  153. data/spec/reek/context/statement_counter_spec.rb +0 -24
  154. data/spec/reek/context_builder_spec.rb +0 -457
  155. data/spec/reek/detector_repository_spec.rb +0 -22
  156. data/spec/reek/documentation_link_spec.rb +0 -20
  157. data/spec/reek/errors/base_error_spec.rb +0 -13
  158. data/spec/reek/examiner_spec.rb +0 -309
  159. data/spec/reek/logging_error_handler_spec.rb +0 -24
  160. data/spec/reek/rake/task_spec.rb +0 -56
  161. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  162. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  163. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  164. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  165. data/spec/reek/report/html_report_spec.rb +0 -19
  166. data/spec/reek/report/json_report_spec.rb +0 -58
  167. data/spec/reek/report/location_formatter_spec.rb +0 -32
  168. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  169. data/spec/reek/report/text_report_spec.rb +0 -89
  170. data/spec/reek/report/xml_report_spec.rb +0 -24
  171. data/spec/reek/report/yaml_report_spec.rb +0 -55
  172. data/spec/reek/report_spec.rb +0 -28
  173. data/spec/reek/smell_configuration_spec.rb +0 -56
  174. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  175. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  176. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  177. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  178. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  179. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  180. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  181. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  182. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  183. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  184. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  185. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  186. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  187. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  188. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  189. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  190. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  191. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  192. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  193. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  194. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  195. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  196. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  197. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  198. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  199. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  200. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  201. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  202. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  203. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
  204. data/spec/reek/smell_warning_spec.rb +0 -137
  205. data/spec/reek/source/source_code_spec.rb +0 -79
  206. data/spec/reek/source/source_locator_spec.rb +0 -166
  207. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  208. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  209. data/spec/reek/spec/should_reek_spec.rb +0 -52
  210. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  211. data/spec/reek/tree_dresser_spec.rb +0 -46
  212. data/spec/spec_helper.rb +0 -110
  213. data/tasks/configuration.rake +0 -18
  214. data/tasks/console.rake +0 -5
  215. data/tasks/reek.rake +0 -6
  216. data/tasks/rubocop.rake +0 -11
  217. data/tasks/test.rake +0 -32
@@ -1,195 +0,0 @@
1
- require 'pathname'
2
- require_relative '../../spec_helper'
3
- require_lib 'reek/configuration/app_configuration'
4
- require_lib 'reek/configuration/directory_directives'
5
- require_lib 'reek/configuration/default_directive'
6
- require_lib 'reek/configuration/excluded_paths'
7
-
8
- RSpec.describe Reek::Configuration::AppConfiguration do
9
- describe 'factory methods' do
10
- around do |example|
11
- Dir.mktmpdir do |tmp|
12
- Dir.chdir(tmp) do
13
- example.run
14
- end
15
- end
16
- end
17
-
18
- let(:expected_exclude_file_names) do
19
- %w(exclude_me.rb exclude_me_too.rb)
20
- end
21
-
22
- let(:expected_exclude_directories) do
23
- %w(directory_with_trailing_slash/ directory_without_trailing_slash)
24
- end
25
-
26
- let(:expected_excluded_paths) do
27
- (expected_exclude_file_names + expected_exclude_directories).map { |path| Pathname(path) }
28
- end
29
-
30
- let(:expected_default_directive) do
31
- { Reek::SmellDetectors::IrresponsibleModule => { 'enabled' => false } }
32
- end
33
-
34
- let(:expected_directory_directives) do
35
- { Pathname('directory_with_some_ruby_files') => {
36
- Reek::SmellDetectors::UtilityFunction => { 'enabled' => false }
37
- } }
38
- end
39
-
40
- describe '#from_path' do
41
- let(:configuration_path) { 'config.reek' }
42
- let(:configuration) do
43
- <<~YAML
44
- ---
45
- detectors:
46
- IrresponsibleModule:
47
- enabled: false
48
- directories:
49
- "directory_with_some_ruby_files":
50
- UtilityFunction:
51
- enabled: false
52
- exclude_paths:
53
- - "exclude_me.rb"
54
- - "exclude_me_too.rb"
55
- - "directory_with_trailing_slash/"
56
- - "directory_without_trailing_slash"
57
- YAML
58
- end
59
-
60
- before do
61
- File.write configuration_path, configuration
62
- FileUtils.touch expected_exclude_file_names
63
- FileUtils.mkdir expected_exclude_directories
64
- end
65
-
66
- it 'properly loads configuration and processes it' do
67
- config = described_class.from_path configuration_path
68
-
69
- expect(config.send(:excluded_paths)).to eq(expected_excluded_paths)
70
- expect(config.send(:default_directive)).to eq(expected_default_directive)
71
- expect(config.send(:directory_directives)).to eq(expected_directory_directives)
72
- end
73
- end
74
-
75
- describe '#from_hash' do
76
- before do
77
- FileUtils.touch expected_exclude_file_names
78
- FileUtils.mkdir expected_exclude_directories
79
- end
80
-
81
- let(:default_directive_value) do
82
- { Reek::DETECTORS_KEY => {
83
- 'IrresponsibleModule' => { 'enabled' => false }
84
- } }
85
- end
86
-
87
- let(:directory_directives_value) do
88
- { Reek::DIRECTORIES_KEY => {
89
- 'directory_with_some_ruby_files' => {
90
- 'UtilityFunction' => { 'enabled' => false }
91
- }
92
- } }
93
- end
94
-
95
- let(:exclude_paths_value) do
96
- { Reek::EXCLUDE_PATHS_KEY => (expected_exclude_file_names + expected_exclude_directories) }
97
- end
98
-
99
- let(:combined_value) do
100
- directory_directives_value.
101
- merge(default_directive_value).
102
- merge(exclude_paths_value)
103
- end
104
-
105
- it 'sets the configuration a unified simple data structure' do
106
- config = described_class.from_hash(combined_value)
107
-
108
- expect(config.send(:excluded_paths)).to eq(expected_excluded_paths)
109
- expect(config.send(:default_directive)).to eq(expected_default_directive)
110
- expect(config.send(:directory_directives)).to eq(expected_directory_directives)
111
- end
112
- end
113
- end
114
-
115
- describe '#default' do
116
- it 'returns a blank AppConfiguration' do
117
- config = described_class.default
118
- expect(config).to be_instance_of described_class
119
- expect(config.send(:excluded_paths)).to eq([])
120
- expect(config.send(:default_directive)).to eq({})
121
- expect(config.send(:directory_directives)).to eq({})
122
- end
123
- end
124
-
125
- describe '#directive_for' do
126
- context 'with multiple directory directives and no default directive present' do
127
- let(:source_via) { 'samples/some_files/dummy1.rb' }
128
- let(:baz_config) { { IrresponsibleModule: { enabled: false } } }
129
- let(:bang_config) { { Attribute: { enabled: true } } }
130
- let(:expected_result) { { Reek::SmellDetectors::Attribute => { enabled: true } } }
131
-
132
- let(:directory_directives) do
133
- {
134
- Reek::DIRECTORIES_KEY => {
135
- 'samples/some_files' => bang_config,
136
- 'samples/other_files' => baz_config
137
- }
138
- }
139
- end
140
-
141
- it 'returns the corresponding directive' do
142
- configuration = described_class.from_hash directory_directives
143
- expect(configuration.directive_for(source_via)).to eq expected_result
144
- end
145
- end
146
-
147
- context 'with directory directive and default directive present' do
148
- let(:directory) { 'spec/samples/two_smelly_files/' }
149
- let(:source_via) { "#{directory}/dummy.rb" }
150
-
151
- let(:configuration_as_hash) do
152
- {
153
- Reek::DIRECTORIES_KEY => {
154
- directory => { TooManyStatements: { max_statements: 8 } }
155
- },
156
- Reek::DETECTORS_KEY => {
157
- IrresponsibleModule: { enabled: false },
158
- TooManyStatements: { max_statements: 15 }
159
- }
160
- }
161
- end
162
-
163
- it 'returns the directory directive with the default directive reverse-merged' do
164
- configuration = described_class.from_hash configuration_as_hash
165
- actual = configuration.directive_for(source_via)
166
-
167
- expect(actual[Reek::SmellDetectors::IrresponsibleModule]).to be_truthy
168
- expect(actual[Reek::SmellDetectors::TooManyStatements]).to be_truthy
169
- expect(actual[Reek::SmellDetectors::TooManyStatements][:max_statements]).to eq(8)
170
- end
171
- end
172
-
173
- context 'with a path not covered by a directory directive but a default directive present' do
174
- let(:source_via) { 'samples/some_files/dummy.rb' }
175
-
176
- let(:configuration_as_hash) do
177
- {
178
- Reek::DETECTORS_KEY => {
179
- IrresponsibleModule: { enabled: false }
180
- },
181
- Reek::DIRECTORIES_KEY => {
182
- 'samples/other_files' => { Attribute: { enabled: false } }
183
- }
184
- }
185
- end
186
-
187
- let(:expected_result) { { Reek::SmellDetectors::IrresponsibleModule => { enabled: false } } }
188
-
189
- it 'returns the default directive' do
190
- configuration = described_class.from_hash configuration_as_hash
191
- expect(configuration.directive_for(source_via)).to eq expected_result
192
- end
193
- end
194
- end
195
- end
@@ -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