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,166 +0,0 @@
1
- require 'pathname'
2
- require_relative '../../spec_helper'
3
- require_lib 'reek/configuration/app_configuration'
4
- require_lib 'reek/source/source_locator'
5
-
6
- RSpec.describe Reek::Source::SourceLocator do
7
- describe '#sources' do
8
- context 'when applied to hidden directories' do
9
- let(:path) { SAMPLES_DIR.join('source_with_hidden_directories') }
10
-
11
- let(:expected_paths) do
12
- [path.join('not_hidden.rb')]
13
- end
14
-
15
- let(:paths_that_are_expected_to_be_ignored) do
16
- [path.join('.hidden/hidden.rb')]
17
- end
18
-
19
- it 'does not scan hidden directories' do
20
- sources = described_class.new([path]).sources
21
-
22
- expect(sources).not_to include(*paths_that_are_expected_to_be_ignored)
23
- end
24
-
25
- it 'scans directories that are not hidden' do
26
- sources = described_class.new([path]).sources
27
-
28
- expect(sources).to match_array expected_paths
29
- end
30
- end
31
-
32
- context 'with excluded paths' do
33
- let(:configuration) do
34
- test_configuration_for(CONFIGURATION_DIR.join('with_excluded_paths.reek'))
35
- end
36
-
37
- let(:options) { instance_double('Reek::CLI::Options', force_exclusion?: false) }
38
-
39
- context 'when the path is absolute' do
40
- let(:path) do
41
- SAMPLES_DIR.join('source_with_exclude_paths',
42
- 'ignore_me',
43
- 'uncommunicative_method_name.rb').expand_path
44
- end
45
-
46
- context 'when options.force_exclusion? is true' do
47
- before do
48
- allow(options).to receive(:force_exclusion?).and_return(true)
49
- end
50
-
51
- it 'excludes this file' do
52
- sources = described_class.new([path], configuration: configuration, options: options).sources
53
- expect(sources).not_to include(path)
54
- end
55
- end
56
-
57
- context 'when options.force_exclusion? is false' do
58
- before do
59
- allow(options).to receive(:force_exclusion?).and_return(false)
60
- end
61
-
62
- it 'includes this file' do
63
- sources = described_class.new([path], configuration: configuration, options: options).sources
64
- expect(sources).to include(path)
65
- end
66
- end
67
- end
68
-
69
- context 'when the path is a file name in an excluded directory' do
70
- let(:path) { SAMPLES_DIR.join('source_with_exclude_paths', 'ignore_me', 'uncommunicative_method_name.rb') }
71
-
72
- context 'when options.force_exclusion? is true' do
73
- before do
74
- allow(options).to receive(:force_exclusion?).and_return(true)
75
- end
76
-
77
- it 'excludes this file' do
78
- sources = described_class.new([path], configuration: configuration, options: options).sources
79
- expect(sources).not_to include(path)
80
- end
81
- end
82
-
83
- context 'when options.force_exclusion? is false' do
84
- before do
85
- allow(options).to receive(:force_exclusion?).and_return(false)
86
- end
87
-
88
- it 'includes this file' do
89
- sources = described_class.new([path], configuration: configuration, options: options).sources
90
- expect(sources).to include(path)
91
- end
92
- end
93
- end
94
-
95
- context 'when path is a directory or a file' do
96
- let(:path) { SAMPLES_DIR.join('source_with_exclude_paths') }
97
-
98
- let(:expected_paths) do
99
- [path.join('nested/uncommunicative_variable_name.rb')]
100
- end
101
-
102
- let(:paths_that_are_expected_to_be_ignored) do
103
- [
104
- path.join('ignore_me/uncommunicative_method_name.rb'),
105
- path.join('nested/ignore_me_as_well/irresponsible_module.rb'),
106
- path.join('nested/uncommunicative_parameter_name.rb')
107
- ]
108
- end
109
-
110
- it 'does not use excluded paths' do
111
- sources = described_class.new([path], configuration: configuration, options: options).sources
112
- expect(sources).not_to include(*paths_that_are_expected_to_be_ignored)
113
- end
114
-
115
- it 'scans directories and files that are not excluded' do
116
- sources = described_class.new([path], configuration: configuration).sources
117
- expect(sources).to eq expected_paths
118
- end
119
- end
120
- end
121
-
122
- context 'with non-Ruby paths' do
123
- let(:path) { SAMPLES_DIR.join('source_with_non_ruby_files') }
124
- let(:expected_sources) do
125
- [path.join('ruby.rb')]
126
- end
127
- let(:paths_that_are_expected_to_be_ignored) do
128
- [
129
- path.join('gibberish'),
130
- path.join('python_source.py')
131
- ]
132
- end
133
-
134
- it 'uses Ruby source paths' do
135
- sources = described_class.new([path]).sources
136
-
137
- expect(sources).to include(*expected_sources)
138
- end
139
-
140
- it 'does not use non-Ruby source paths' do
141
- sources = described_class.new([path]).sources
142
-
143
- expect(sources).not_to include(*paths_that_are_expected_to_be_ignored)
144
- end
145
- end
146
-
147
- context 'when passing "." or "./" as argument' do
148
- let(:expected_sources) do
149
- [Pathname.new('spec/spec_helper.rb'), Pathname.new('lib/reek.rb')]
150
- end
151
-
152
- it 'expands it correctly' do
153
- sources_for_dot = described_class.new([Pathname.new('.')]).sources
154
-
155
- expect(sources_for_dot).to include(*expected_sources)
156
- end
157
-
158
- it 'ignores the trailing slash' do
159
- sources_for_dot = described_class.new([Pathname.new('.')]).sources
160
- sources_for_dot_slash = described_class.new([Pathname.new('./')]).sources
161
-
162
- expect(sources_for_dot).to eq(sources_for_dot_slash)
163
- end
164
- end
165
- end
166
- end
@@ -1,153 +0,0 @@
1
- require 'pathname'
2
- require_relative '../../spec_helper'
3
- require_lib 'reek/spec'
4
-
5
- RSpec.describe Reek::Spec::ShouldReekOf do
6
- describe 'smell type selection' do
7
- let(:ruby) { 'def double_thing() @other.thing.foo + @other.thing.foo end' }
8
-
9
- it 'reports duplicate calls by smell type' do
10
- expect(ruby).to reek_of(:DuplicateMethodCall)
11
- end
12
-
13
- it 'does not report any feature envy' do
14
- expect(ruby).not_to reek_of(:FeatureEnvy)
15
- end
16
- end
17
-
18
- describe 'different sources of input' do
19
- context 'when checking code in a string' do
20
- let(:clean_code) { 'def good() true; end' }
21
- let(:matcher) { described_class.new(:UncommunicativeVariableName, name: 'y') }
22
- let(:smelly_code) { 'def x() y = 4; end' }
23
-
24
- it 'matches a smelly String' do
25
- expect(matcher).to be_matches(smelly_code)
26
- end
27
-
28
- it 'doesnt match a fragrant String' do
29
- expect(matcher).not_to be_matches(clean_code)
30
- end
31
-
32
- it 're-calculates matches every time' do
33
- matcher.matches? smelly_code
34
- expect(matcher).not_to be_matches(clean_code)
35
- end
36
- end
37
-
38
- context 'when checking code in a File' do
39
- let(:matcher) { described_class.new(:UncommunicativeMethodName, name: 'x') }
40
-
41
- it 'matches a smelly file' do
42
- expect(matcher).to be_matches(SMELLY_FILE)
43
- end
44
-
45
- it 'doesnt match a fragrant file' do
46
- expect(matcher).not_to be_matches(CLEAN_FILE)
47
- end
48
- end
49
- end
50
-
51
- describe 'smell types and smell details' do
52
- context 'when passing in smell_details with unknown parameter name' do
53
- let(:matcher) { described_class.new(:UncommunicativeVariableName, foo: 'y') }
54
- let(:smelly_code) { 'def x() y = 4; end' }
55
-
56
- it 'raises ArgumentError' do
57
- expect { matcher.matches?(smelly_code) }.to raise_error(ArgumentError)
58
- end
59
- end
60
-
61
- context 'when both are matching' do
62
- let(:matcher) { described_class.new(:UncommunicativeVariableName, name: 'y') }
63
- let(:smelly_code) { 'def x() y = 4; end' }
64
-
65
- it 'is truthy' do
66
- expect(matcher).to be_matches(smelly_code)
67
- end
68
- end
69
-
70
- context 'when no smell_type is matching' do
71
- let(:smelly_code) { 'def dummy() y = 4; end' }
72
-
73
- let(:falsey_matcher) { described_class.new(:FeatureEnvy, name: 'y') }
74
- let(:truthy_matcher) { described_class.new(:UncommunicativeVariableName, name: 'y') }
75
-
76
- it 'is falsey' do
77
- expect(falsey_matcher).not_to be_matches(smelly_code)
78
- end
79
-
80
- it 'sets the proper error message' do
81
- falsey_matcher.matches?(smelly_code)
82
-
83
- expect(falsey_matcher.failure_message).to\
84
- match('Expected string to reek of FeatureEnvy, but it didn\'t')
85
- end
86
-
87
- it 'sets the proper error message when negated' do
88
- truthy_matcher.matches?(smelly_code)
89
-
90
- expect(truthy_matcher.failure_message_when_negated).to\
91
- match('Expected string not to reek of UncommunicativeVariableName, but it did')
92
- end
93
- end
94
-
95
- context 'when smell type is matching but smell details are not' do
96
- let(:smelly_code) { 'def double_thing() @other.thing.foo + @other.thing.foo end' }
97
- let(:matcher) { described_class.new(:DuplicateMethodCall, name: 'foo', count: 15) }
98
-
99
- it 'is falsey' do
100
- expect(matcher).not_to be_matches(smelly_code)
101
- end
102
-
103
- it 'sets the proper error message' do
104
- matcher.matches?(smelly_code)
105
- expected = <<~TEXT
106
- Expected string to reek of DuplicateMethodCall (which it did) with smell details {:name=>"foo", :count=>15}, which it didn't.
107
- The number of smell details I had to compare with the given one was 2 and here they are:
108
- 1.)
109
- {"context"=>"double_thing", "lines"=>[1, 1], "message"=>"calls '@other.thing' 2 times", "source"=>"string", "name"=>"@other.thing", "count"=>2}
110
- 2.)
111
- {"context"=>"double_thing", "lines"=>[1, 1], "message"=>"calls '@other.thing.foo' 2 times", "source"=>"string", "name"=>"@other.thing.foo", "count"=>2}
112
- TEXT
113
-
114
- expect(matcher.failure_message).to eq(expected)
115
- end
116
-
117
- it 'sets the proper error message when negated' do
118
- matcher.matches?(smelly_code)
119
-
120
- expect(matcher.failure_message_when_negated).to\
121
- match('Expected string not to reek of DuplicateMethodCall with smell '\
122
- 'details {:name=>"foo", :count=>15}, but it did')
123
- end
124
- end
125
- end
126
-
127
- context 'with a smell that is disabled by default' do
128
- it 'enables the smell detector to match automatically' do
129
- default_config = Reek::SmellDetectors::UnusedPrivateMethod.default_config
130
- src = 'class C; private; def foo; end; end'
131
-
132
- aggregate_failures do
133
- expect(default_config[Reek::SmellConfiguration::ENABLED_KEY]).to be_falsy
134
- expect(src).to reek_of(:UnusedPrivateMethod)
135
- end
136
- end
137
- end
138
-
139
- describe '#with_config' do
140
- let(:matcher) { described_class.new(:UncommunicativeVariableName) }
141
- let(:configured_matcher) { matcher.with_config('accept' => 'x') }
142
-
143
- it 'uses the passed-in configuration for matching' do
144
- expect(configured_matcher).to be_matches('def foo; q = 2; end')
145
- expect(configured_matcher).not_to be_matches('def foo; x = 2; end')
146
- end
147
-
148
- it 'leaves the original matcher intact' do
149
- expect(configured_matcher).not_to be_matches('def foo; x = 2; end')
150
- expect(matcher).to be_matches('def foo; x = 2; end')
151
- end
152
- end
153
- end
@@ -1,91 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/spec'
3
-
4
- RSpec.describe Reek::Spec::ShouldReekOnlyOf do
5
- let(:examiner) { instance_double('Reek::Examiner').as_null_object }
6
- let(:expected_context_name) { 'SmellyClass#big_method' }
7
- let(:expected_smell_type) { :NestedIterators }
8
- let(:matcher) { described_class.new(expected_smell_type) }
9
- let(:matcher_matches) { matcher.matches_examiner?(examiner) }
10
-
11
- before do
12
- allow(examiner).to receive(:smells) { smells }
13
- matcher_matches
14
- end
15
-
16
- shared_examples_for 'no match' do
17
- it 'does not match' do
18
- expect(matcher_matches).to be_falsey
19
- end
20
-
21
- context 'when a match was expected' do
22
- let(:source) { 'the_path/to_a/source_file.rb' }
23
-
24
- before { allow(examiner).to receive(:origin).and_return(source) }
25
-
26
- it 'reports the source' do
27
- expect(matcher.failure_message).to match(source)
28
- end
29
-
30
- it 'reports the expected smell class' do
31
- expect(matcher.failure_message).to match(expected_smell_type.to_s)
32
- end
33
- end
34
- end
35
-
36
- context 'with no smells' do
37
- let(:smells) { [] }
38
-
39
- it_behaves_like 'no match'
40
- end
41
-
42
- context 'with 1 non-matching smell' do
43
- let(:smells) { [build_smell_warning(smell_type: 'ControlParameter')] }
44
-
45
- it_behaves_like 'no match'
46
- end
47
-
48
- context 'with 2 non-matching smells' do
49
- let(:smells) do
50
- [
51
- build_smell_warning(smell_type: 'ControlParameter'),
52
- build_smell_warning(smell_type: 'FeatureEnvy')
53
- ]
54
- end
55
-
56
- it_behaves_like 'no match'
57
- end
58
-
59
- context 'with 1 non-matching and 1 matching smell' do
60
- let(:smells) do
61
- [
62
- build_smell_warning(smell_type: 'ControlParameter'),
63
- build_smell_warning(smell_type: expected_smell_type.to_s,
64
- message: "message mentioning #{expected_context_name}")
65
- ]
66
- end
67
-
68
- it_behaves_like 'no match'
69
- end
70
-
71
- context 'with 1 matching smell' do
72
- let(:smells) do
73
- [build_smell_warning(smell_type: expected_smell_type.to_s,
74
- message: "message mentioning #{expected_context_name}")]
75
- end
76
-
77
- it 'matches' do
78
- expect(matcher_matches).to be_truthy
79
- end
80
-
81
- it 'reports the expected smell when no match was expected' do
82
- expect(matcher.failure_message_when_negated).to match(expected_smell_type.to_s)
83
- end
84
-
85
- it 'reports the source when no match was expected' do
86
- source = 'the_path/to_a/source_file.rb'
87
- allow(examiner).to receive(:origin).and_return(source)
88
- expect(matcher.failure_message_when_negated).to match(source)
89
- end
90
- end
91
- end
@@ -1,52 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/spec'
3
-
4
- RSpec.describe Reek::Spec::ShouldReek do
5
- describe 'checking code in a string' do
6
- let(:matcher) { described_class.new }
7
- let(:clean_code) { 'def good() true; end' }
8
- let(:smelly_code) { 'def x() y = 4; end' }
9
-
10
- it 'matches a smelly String' do
11
- expect(matcher).to be_matches(smelly_code)
12
- end
13
-
14
- it 'doesnt match a fragrant String' do
15
- expect(matcher).not_to be_matches(clean_code)
16
- end
17
-
18
- it 'reports the smells when should_not fails' do
19
- matcher.matches?(smelly_code)
20
- expect(matcher.failure_message_when_negated).to match('UncommunicativeVariableName')
21
- end
22
- end
23
-
24
- describe 'checking code in a File' do
25
- context 'without masking' do
26
- let(:matcher) { described_class.new }
27
-
28
- it 'matches a smelly File' do
29
- expect(matcher).to be_matches(SMELLY_FILE)
30
- end
31
-
32
- it 'doesnt match a fragrant File' do
33
- expect(matcher).not_to be_matches(CLEAN_FILE)
34
- end
35
-
36
- it 'reports the smells when should_not fails' do
37
- matcher.matches?(SMELLY_FILE)
38
- expect(matcher.failure_message_when_negated).to match('UncommunicativeMethodName')
39
- end
40
- end
41
-
42
- context 'with masking' do
43
- let(:path) { CONFIGURATION_DIR.join('full_mask.reek') }
44
- let(:configuration) { test_configuration_for(path) }
45
- let(:matcher) { described_class.new(configuration: configuration) }
46
-
47
- it 'masks smells using the relevant configuration' do
48
- expect(matcher).not_to be_matches(SMELLY_FILE)
49
- end
50
- end
51
- end
52
- end