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,22 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/smell_detectors/base_detector'
3
- require_lib 'reek/detector_repository'
4
-
5
- RSpec.describe Reek::DetectorRepository do
6
- describe '.smell_types' do
7
- let(:smell_types) { described_class.smell_types }
8
-
9
- it 'includes existing smell_types' do
10
- expect(smell_types).to include(Reek::SmellDetectors::IrresponsibleModule,
11
- Reek::SmellDetectors::TooManyStatements)
12
- end
13
-
14
- it 'excludes the smell detector base class' do
15
- expect(smell_types).not_to include(Reek::SmellDetectors::BaseDetector)
16
- end
17
-
18
- it 'returns the smell types in alphabetic order' do
19
- expect(smell_types).to eq(smell_types.sort_by(&:name))
20
- end
21
- end
22
- end
@@ -1,20 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- RSpec.describe Reek::DocumentationLink do
4
- describe '.build' do
5
- it 'returns the correct link for a smell type' do
6
- expect(described_class.build('FeatureEnvy')).
7
- to eq "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Feature-Envy.md"
8
- end
9
-
10
- it 'returns the correct link for general documentation' do
11
- expect(described_class.build('Rake Task')).
12
- to eq "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Rake-Task.md"
13
- end
14
-
15
- it 'returns the correct link for subjects with abbreviations' do
16
- expect(described_class.build('YAML Report')).
17
- to eq "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/YAML-Report.md"
18
- end
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- require_relative '../../spec_helper'
2
-
3
- require_lib 'reek/errors/base_error'
4
-
5
- RSpec.describe Reek::Errors::BaseError do
6
- let(:error) { described_class.new }
7
-
8
- describe '#long_message' do
9
- it 'returns the message' do
10
- expect(error.long_message).to eq error.message
11
- end
12
- end
13
- end
@@ -1,309 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/examiner'
3
- require_lib 'reek/logging_error_handler'
4
-
5
- RSpec.shared_examples_for 'no smells found' do
6
- it 'is not smelly' do
7
- expect(examiner).not_to be_smelly
8
- end
9
-
10
- it 'finds no smells' do
11
- expect(examiner.smells.length).to eq(0)
12
- end
13
- end
14
-
15
- RSpec.shared_examples_for 'one smell found' do
16
- it 'is smelly' do
17
- expect(examiner).to be_smelly
18
- end
19
-
20
- it 'reports the smell' do
21
- expect(examiner.smells.length).to eq(1)
22
- end
23
-
24
- it 'reports the correct smell' do
25
- expect(examiner.smells[0].smell_type).to eq(expected_first_smell)
26
- end
27
- end
28
-
29
- RSpec.describe Reek::Examiner do
30
- context 'with a fragrant String' do
31
- let(:examiner) { described_class.new('def good() true; end') }
32
-
33
- it_behaves_like 'no smells found'
34
- end
35
-
36
- context 'with a smelly String' do
37
- let(:examiner) { described_class.new('def fine() y = 4; end') }
38
- let(:expected_first_smell) { 'UncommunicativeVariableName' }
39
-
40
- it_behaves_like 'one smell found'
41
- end
42
-
43
- context 'with a partially masked smelly File' do
44
- let(:configuration) { test_configuration_for(path) }
45
- let(:examiner) do
46
- described_class.new(SMELLY_FILE,
47
- filter_by_smells: [],
48
- configuration: configuration)
49
- end
50
- let(:path) { CONFIGURATION_DIR.join('partial_mask.reek') }
51
- let(:expected_first_smell) { 'UncommunicativeVariableName' }
52
-
53
- it_behaves_like 'one smell found'
54
- end
55
-
56
- context 'with a fragrant File' do
57
- let(:examiner) { described_class.new(CLEAN_FILE) }
58
-
59
- it_behaves_like 'no smells found'
60
- end
61
-
62
- describe '#origin' do
63
- let(:source) { 'class C; def f; end; end' }
64
- let(:examiner) { described_class.new(source) }
65
-
66
- it 'returns "string" for a string source' do
67
- expect(examiner.origin).to eq('string')
68
- end
69
- end
70
-
71
- describe '#smells' do
72
- it 'returns the detected smell warnings' do
73
- code = 'def foo; bar.call_me(); bar.call_me(); end'
74
- examiner = described_class.new code, filter_by_smells: ['DuplicateMethodCall']
75
-
76
- smell = examiner.smells.first
77
- expect(smell).to be_a(Reek::SmellWarning)
78
- expect(smell.message).to eq("calls 'bar.call_me()' 2 times")
79
- end
80
-
81
- context 'with a source with three smells' do
82
- let(:source) { 'class C; def f; end; end' }
83
- let(:examiner) { described_class.new(source) }
84
-
85
- it 'has the right smells' do
86
- smells = examiner.smells
87
- expect(smells.map(&:message)).
88
- to eq ['has no descriptive comment',
89
- "has the name 'f'",
90
- "has the name 'C'"]
91
- end
92
- end
93
-
94
- context 'when source only contains comments' do
95
- let(:source) do
96
- <<-RUBY
97
- # Just a comment
98
- # And another
99
- RUBY
100
- end
101
- let(:examiner) do
102
- described_class.new(source)
103
- end
104
-
105
- it 'has no warnings' do
106
- expect(examiner.smells).to eq([])
107
- end
108
- end
109
-
110
- context 'with an incomprehensible source that causes the detectors to crash' do
111
- let(:source) { 'class C; def does_crash_reek; end; end' }
112
-
113
- let(:examiner) do
114
- detector_repository = instance_double 'Reek::DetectorRepository'
115
- allow(detector_repository).to receive(:examine) do
116
- raise ArgumentError, 'Looks like bad source'
117
- end
118
- class_double('Reek::DetectorRepository').as_stubbed_const
119
- allow(Reek::DetectorRepository).to receive(:eligible_smell_types)
120
- allow(Reek::DetectorRepository).to receive(:new).and_return detector_repository
121
-
122
- described_class.new source
123
- end
124
-
125
- it 'raises an incomprehensible source error' do
126
- expect { examiner.smells }.to raise_error Reek::Errors::IncomprehensibleSourceError
127
- end
128
-
129
- it 'explains the origin of the error' do
130
- origin = 'string'
131
- expect { examiner.smells }.
132
- to raise_error.with_message("Source #{origin} cannot be processed by Reek.")
133
- end
134
-
135
- it 'explains what to do' do
136
- explanation = 'It would be great if you could report this back to the Reek team'
137
- expect { examiner.smells }.
138
- to raise_error { |it| expect(it.long_message).to match(/#{explanation}/) }
139
- end
140
-
141
- it 'contains the original error message' do
142
- original = 'Looks like bad source'
143
- expect { examiner.smells }.
144
- to raise_error { |it| expect(it.long_message).to match(/#{original}/) }
145
- end
146
-
147
- it 'shows the original exception class' do
148
- expect { examiner.smells }.
149
- to raise_error { |it| expect(it.long_message).to match(/ArgumentError/) }
150
- end
151
- end
152
- end
153
-
154
- describe '#smells_count' do
155
- let(:source) { 'class C; def f; end; end' }
156
- let(:examiner) { described_class.new(source) }
157
-
158
- it 'has the right smell count' do
159
- expect(examiner.smells_count).to eq(3)
160
- end
161
- end
162
-
163
- context 'when the source causes the source buffer to crash' do
164
- let(:source) { 'I make the buffer crash' }
165
-
166
- before do
167
- buffer = double
168
- allow(buffer).to receive(:source=) { raise RuntimeError }
169
- allow(Parser::Source::Buffer).to receive(:new).and_return(buffer)
170
- end
171
-
172
- context 'when the error handler does not handle the error' do
173
- let(:examiner) { described_class.new(source) }
174
-
175
- it 'does not raise an error during initialization' do
176
- expect { examiner }.not_to raise_error
177
- end
178
-
179
- it 'raises an incomprehensible source error when asked for smells' do
180
- expect { examiner.smells }.to raise_error Reek::Errors::IncomprehensibleSourceError
181
- end
182
- end
183
-
184
- context 'when the error handler handles the error' do
185
- let(:handler) { instance_double(Reek::LoggingErrorHandler, handle: true) }
186
- let(:examiner) { described_class.new(source, error_handler: handler) }
187
-
188
- it 'does not raise an error when asked for smells' do
189
- expect { examiner.smells }.not_to raise_error
190
- end
191
-
192
- it 'passes the wrapped error to the handler' do
193
- examiner.smells
194
- expect(handler).to have_received(:handle).with(Reek::Errors::IncomprehensibleSourceError)
195
- end
196
- end
197
- end
198
-
199
- context 'with a source that triggers a syntax error' do
200
- let(:examiner) { described_class.new(source) }
201
- let(:source) do
202
- <<~RUBY
203
- 1 2 3
204
- RUBY
205
- end
206
-
207
- it 'does not raise an error during initialization' do
208
- expect { examiner }.not_to raise_error
209
- end
210
-
211
- it 'raises an encoding error when asked for smells' do
212
- expect { examiner.smells }.to raise_error Reek::Errors::SyntaxError
213
- end
214
-
215
- it 'explains the origin of the error' do
216
- message = "Source 'string' cannot be processed by Reek due to a syntax error in the source file."
217
- expect { examiner.smells }.to raise_error.with_message(/#{message}/)
218
- end
219
-
220
- it 'shows the original exception class' do
221
- expect { examiner.smells }.
222
- to raise_error { |it| expect(it.long_message).to match(/Parser::SyntaxError/) }
223
- end
224
- end
225
-
226
- context 'with a source that triggers an encoding error' do
227
- let(:examiner) { described_class.new(source) }
228
- let(:source) do
229
- <<~RUBY
230
- # encoding: US-ASCII
231
- puts 'こんにちは世界'
232
- RUBY
233
- end
234
-
235
- it 'does not raise an error during initialization' do
236
- expect { examiner }.not_to raise_error
237
- end
238
-
239
- it 'raises an encoding error when asked for smells' do
240
- expect { examiner.smells }.to raise_error Reek::Errors::EncodingError
241
- end
242
-
243
- it 'explains the origin of the error' do
244
- message = "Source 'string' cannot be processed by Reek due to an encoding error in the source file."
245
- expect { examiner.smells }.to raise_error.with_message(/#{message}/)
246
- end
247
-
248
- it 'shows the original exception class' do
249
- expect { examiner.smells }.
250
- to raise_error { |it| expect(it.long_message).to match(/InvalidByteSequenceError/) }
251
- end
252
- end
253
-
254
- describe 'bad comment config' do
255
- let(:examiner) { described_class.new(source) }
256
-
257
- context 'with an unknown smell detector' do
258
- let(:source) do
259
- <<-RUBY
260
- # :reek:DoesNotExist
261
- def alfa; end
262
- RUBY
263
- end
264
-
265
- it 'raises a bad detector name error' do
266
- expect { examiner.smells }.to raise_error Reek::Errors::BadDetectorInCommentError
267
- end
268
-
269
- it 'explains the reason for the error' do
270
- message = "You are trying to configure an unknown smell detector 'DoesNotExist'"
271
-
272
- expect { examiner.smells }.to raise_error.with_message(/#{message}/)
273
- end
274
-
275
- it 'explains the origin of the error' do
276
- details = "The source is 'string' and the comment belongs "\
277
- 'to the expression starting in line 2.'
278
-
279
- expect { examiner.smells }.to raise_error.with_message(/#{details}/)
280
- end
281
- end
282
-
283
- context 'with garbage in detector config' do
284
- let(:source) do
285
- <<-RUBY
286
- # :reek:UncommunicativeMethodName { thats: a: bad: config }
287
- def alfa; end
288
- RUBY
289
- end
290
-
291
- it 'raises a garbarge configuration error' do
292
- expect { examiner.smells }.to raise_error Reek::Errors::GarbageDetectorConfigurationInCommentError
293
- end
294
-
295
- it 'explains the reason for the error' do
296
- message = "Error: You are trying to configure the smell detector 'UncommunicativeMethodName'"
297
-
298
- expect { examiner.smells }.to raise_error.with_message(/#{message}/)
299
- end
300
-
301
- it 'explains the origin of the error' do
302
- details = "The source is 'string' and the comment belongs "\
303
- 'to the expression starting in line 2.'
304
-
305
- expect { examiner.smells }.to raise_error.with_message(/#{details}/)
306
- end
307
- end
308
- end
309
- end
@@ -1,24 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/logging_error_handler'
3
-
4
- RSpec.describe Reek::LoggingErrorHandler do
5
- describe '#handle' do
6
- let(:exception) { RuntimeError.new('some message') }
7
- let(:handler) { described_class.new }
8
-
9
- it "outputs the exception's message to stderr" do
10
- expect { handler.handle(exception) }.
11
- to output(/some message/).to_stderr
12
- end
13
-
14
- it 'indicates the exception has been appropriately handled' do
15
- result = false
16
-
17
- Reek::CLI::Silencer.silently do
18
- result = handler.handle(exception)
19
- end
20
-
21
- expect(result).to be_truthy
22
- end
23
- end
24
- end
@@ -1,56 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/rake/task'
3
-
4
- RSpec.describe Reek::Rake::Task do
5
- describe '#source_files' do
6
- it 'is set to "lib/**/*.rb" by default' do
7
- task = described_class.new
8
- expect(task.source_files).to eq FileList['lib/**/*.rb']
9
- end
10
-
11
- it 'is set to ENV["REEK_SRC"]' do
12
- begin
13
- ENV['REEK_SRC'] = '*.rb'
14
- task = described_class.new
15
- expect(task.source_files).to eq FileList['*.rb']
16
- ensure
17
- ENV['REEK_SRC'] = nil
18
- end
19
- end
20
- end
21
-
22
- describe '#source_files=' do
23
- it 'sets source_files to a FileList when passed a string' do
24
- task = described_class.new do |it|
25
- it.source_files = '*.rb'
26
- end
27
- expect(task.source_files).to eq FileList['*.rb']
28
- end
29
-
30
- it 'has no effect when ENV["REEK_SRC"] is set' do
31
- begin
32
- ENV['REEK_SRC'] = '*.rb'
33
- task = described_class.new do |it|
34
- it.source_files = 'lib/*.rb'
35
- end
36
- expect(task.source_files).to eq FileList['*.rb']
37
- ensure
38
- ENV['REEK_SRC'] = nil
39
- end
40
- end
41
- end
42
-
43
- # SMELL: Testing a private method
44
- describe '#command' do
45
- let(:task) { described_class.new }
46
-
47
- it 'does not include a config file by default' do
48
- expect(task.send(:command)).not_to include '-c'
49
- end
50
-
51
- it 'includes a config file when set' do
52
- task.config_file = 'foo.reek'
53
- expect(task.send(:command)[1..2]).to eq ['-c', 'foo.reek']
54
- end
55
- end
56
- end