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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/CONTRIBUTING.md +3 -0
- data/Dockerfile +1 -1
- data/Gemfile +6 -6
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
- data/lib/reek/smell_detectors/base_detector.rb +1 -1
- data/lib/reek/smell_warning.rb +1 -1
- data/lib/reek/source/source_locator.rb +1 -3
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +4 -1
- metadata +3 -208
- data/docs/API.md +0 -174
- data/docs/Attribute.md +0 -39
- data/docs/Basic-Smell-Options.md +0 -85
- data/docs/Boolean-Parameter.md +0 -54
- data/docs/Class-Variable.md +0 -40
- data/docs/Code-Smells.md +0 -39
- data/docs/Command-Line-Options.md +0 -119
- data/docs/Control-Couple.md +0 -26
- data/docs/Control-Parameter.md +0 -32
- data/docs/Data-Clump.md +0 -46
- data/docs/Duplicate-Method-Call.md +0 -264
- data/docs/Feature-Envy.md +0 -93
- data/docs/How-To-Write-New-Detectors.md +0 -132
- data/docs/How-reek-works-internally.md +0 -114
- data/docs/Instance-Variable-Assumption.md +0 -163
- data/docs/Irresponsible-Module.md +0 -47
- data/docs/Large-Class.md +0 -16
- data/docs/Long-Parameter-List.md +0 -39
- data/docs/Long-Yield-List.md +0 -37
- data/docs/Manual-Dispatch.md +0 -30
- data/docs/Missing-Safe-Method.md +0 -92
- data/docs/Module-Initialize.md +0 -62
- data/docs/Nested-Iterators.md +0 -59
- data/docs/Nil-Check.md +0 -47
- data/docs/RSpec-matchers.md +0 -129
- data/docs/Rake-Task.md +0 -66
- data/docs/Reek-4-to-Reek-5-migration.md +0 -188
- data/docs/Reek-Driven-Development.md +0 -46
- data/docs/Repeated-Conditional.md +0 -47
- data/docs/Simulated-Polymorphism.md +0 -16
- data/docs/Smell-Suppression.md +0 -96
- data/docs/Style-Guide.md +0 -19
- data/docs/Subclassed-From-Core-Class.md +0 -79
- data/docs/Too-Many-Constants.md +0 -37
- data/docs/Too-Many-Instance-Variables.md +0 -43
- data/docs/Too-Many-Methods.md +0 -56
- data/docs/Too-Many-Statements.md +0 -54
- data/docs/Uncommunicative-Method-Name.md +0 -94
- data/docs/Uncommunicative-Module-Name.md +0 -92
- data/docs/Uncommunicative-Name.md +0 -18
- data/docs/Uncommunicative-Parameter-Name.md +0 -90
- data/docs/Uncommunicative-Variable-Name.md +0 -96
- data/docs/Unused-Parameters.md +0 -28
- data/docs/Unused-Private-Method.md +0 -101
- data/docs/Utility-Function.md +0 -56
- data/docs/Versioning-Policy.md +0 -7
- data/docs/YAML-Reports.md +0 -93
- data/docs/defaults.reek.yml +0 -129
- data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
- data/docs/templates/default/docstring/setup.rb +0 -35
- data/docs/templates/default/fulldoc/html/css/common.css +0 -1
- data/docs/yard_plugin.rb +0 -17
- data/features/command_line_interface/basic_usage.feature +0 -15
- data/features/command_line_interface/options.feature +0 -123
- data/features/command_line_interface/show_progress.feature +0 -33
- data/features/command_line_interface/smell_selection.feature +0 -15
- data/features/command_line_interface/smells_count.feature +0 -38
- data/features/command_line_interface/stdin.feature +0 -65
- data/features/configuration_files/accept_setting.feature +0 -87
- data/features/configuration_files/directory_specific_directives.feature +0 -274
- data/features/configuration_files/exclude_directives.feature +0 -35
- data/features/configuration_files/exclude_paths_directives.feature +0 -42
- data/features/configuration_files/masking_smells.feature +0 -94
- data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
- data/features/configuration_files/reject_setting.feature +0 -89
- data/features/configuration_files/schema_validation.feature +0 -59
- data/features/configuration_files/show_configuration_file.feature +0 -44
- data/features/configuration_files/unused_private_method.feature +0 -68
- data/features/configuration_loading.feature +0 -91
- data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
- data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
- data/features/locales.feature +0 -32
- data/features/programmatic_access.feature +0 -41
- data/features/rake_task/rake_task.feature +0 -138
- data/features/reports/codeclimate.feature +0 -59
- data/features/reports/json.feature +0 -59
- data/features/reports/reports.feature +0 -219
- data/features/reports/yaml.feature +0 -52
- data/features/rspec_matcher.feature +0 -41
- data/features/samples.feature +0 -305
- data/features/step_definitions/.rubocop.yml +0 -5
- data/features/step_definitions/reek_steps.rb +0 -102
- data/features/step_definitions/sample_file_steps.rb +0 -63
- data/features/support/env.rb +0 -33
- data/features/todo_list.feature +0 -108
- data/samples/checkstyle.xml +0 -7
- data/samples/clean_source/clean.rb +0 -6
- data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
- data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
- data/samples/configuration/corrupt.reek +0 -1
- data/samples/configuration/empty.reek +0 -0
- data/samples/configuration/full_configuration.reek +0 -13
- data/samples/configuration/full_mask.reek +0 -6
- data/samples/configuration/home/home.reek.yml +0 -4
- data/samples/configuration/partial_mask.reek +0 -4
- data/samples/configuration/regular_configuration/.reek.yml +0 -4
- data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
- data/samples/configuration/with_excluded_paths.reek +0 -5
- data/samples/no_config_file/.keep +0 -0
- data/samples/paths.rb +0 -5
- data/samples/smelly_source/inline.rb +0 -704
- data/samples/smelly_source/optparse.rb +0 -1788
- data/samples/smelly_source/redcloth.rb +0 -1130
- data/samples/smelly_source/ruby.rb +0 -368
- data/samples/smelly_source/smelly.rb +0 -7
- data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
- data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
- data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
- data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
- data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
- data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
- data/samples/source_with_non_ruby_files/gibberish +0 -1
- data/samples/source_with_non_ruby_files/python_source.py +0 -1
- data/samples/source_with_non_ruby_files/ruby.rb +0 -6
- data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
- data/spec/quality/documentation_spec.rb +0 -41
- data/spec/quality/reek_source_spec.rb +0 -11
- data/spec/reek/ast/node_spec.rb +0 -211
- data/spec/reek/ast/object_refs_spec.rb +0 -83
- data/spec/reek/ast/reference_collector_spec.rb +0 -47
- data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
- data/spec/reek/cli/application_spec.rb +0 -168
- data/spec/reek/cli/command/report_command_spec.rb +0 -44
- data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
- data/spec/reek/cli/options_spec.rb +0 -51
- data/spec/reek/cli/silencer_spec.rb +0 -28
- data/spec/reek/code_comment_spec.rb +0 -184
- data/spec/reek/configuration/app_configuration_spec.rb +0 -195
- data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
- data/spec/reek/configuration/default_directive_spec.rb +0 -13
- data/spec/reek/configuration/directory_directives_spec.rb +0 -122
- data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
- data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
- data/spec/reek/configuration/schema_validator_spec.rb +0 -165
- data/spec/reek/context/code_context_spec.rb +0 -192
- data/spec/reek/context/ghost_context_spec.rb +0 -60
- data/spec/reek/context/method_context_spec.rb +0 -72
- data/spec/reek/context/module_context_spec.rb +0 -55
- data/spec/reek/context/root_context_spec.rb +0 -12
- data/spec/reek/context/statement_counter_spec.rb +0 -24
- data/spec/reek/context_builder_spec.rb +0 -457
- data/spec/reek/detector_repository_spec.rb +0 -22
- data/spec/reek/documentation_link_spec.rb +0 -20
- data/spec/reek/errors/base_error_spec.rb +0 -13
- data/spec/reek/examiner_spec.rb +0 -309
- data/spec/reek/logging_error_handler_spec.rb +0 -24
- data/spec/reek/rake/task_spec.rb +0 -56
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
- data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
- data/spec/reek/report/html_report_spec.rb +0 -19
- data/spec/reek/report/json_report_spec.rb +0 -58
- data/spec/reek/report/location_formatter_spec.rb +0 -32
- data/spec/reek/report/progress_formatter_spec.rb +0 -68
- data/spec/reek/report/text_report_spec.rb +0 -89
- data/spec/reek/report/xml_report_spec.rb +0 -24
- data/spec/reek/report/yaml_report_spec.rb +0 -55
- data/spec/reek/report_spec.rb +0 -28
- data/spec/reek/smell_configuration_spec.rb +0 -56
- data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
- data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
- data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
- data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
- data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
- data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
- data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
- data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
- data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
- data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
- data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
- data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
- data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
- data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
- data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
- data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
- data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
- data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
- data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
- data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
- data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
- data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
- data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
- data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
- data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
- data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
- data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
- data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
- data/spec/reek/smell_warning_spec.rb +0 -137
- data/spec/reek/source/source_code_spec.rb +0 -79
- data/spec/reek/source/source_locator_spec.rb +0 -166
- data/spec/reek/spec/should_reek_of_spec.rb +0 -153
- data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
- data/spec/reek/spec/should_reek_spec.rb +0 -52
- data/spec/reek/spec/smell_matcher_spec.rb +0 -87
- data/spec/reek/tree_dresser_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -110
- data/tasks/configuration.rake +0 -18
- data/tasks/console.rake +0 -5
- data/tasks/reek.rake +0 -6
- data/tasks/rubocop.rake +0 -11
- 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
|
data/spec/reek/examiner_spec.rb
DELETED
@@ -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
|
data/spec/reek/rake/task_spec.rb
DELETED
@@ -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
|