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/report/code_climate/code_climate_configuration'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Report::CodeClimateConfiguration do
|
5
|
-
yml = described_class.load
|
6
|
-
smell_types = Reek::SmellDetectors::BaseDetector.descendants.map(&:smell_type)
|
7
|
-
|
8
|
-
smell_types.each do |name|
|
9
|
-
config = yml.fetch(name)
|
10
|
-
it "provides remediation_points for #{name}" do
|
11
|
-
expect(config['remediation_points']).to be_a Integer
|
12
|
-
end
|
13
|
-
|
14
|
-
it "provides content for #{name}" do
|
15
|
-
expect(config['content']).to be_a String
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'does not include extraneous configuration' do
|
20
|
-
expect(smell_types).to match_array(yml.keys)
|
21
|
-
end
|
22
|
-
end
|
@@ -1,126 +0,0 @@
|
|
1
|
-
require_relative '../../../spec_helper'
|
2
|
-
require_lib 'reek/report/code_climate/code_climate_fingerprint'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Report::CodeClimateFingerprint do
|
5
|
-
describe '#compute' do
|
6
|
-
let(:computed) { described_class.new(warning).compute }
|
7
|
-
|
8
|
-
context 'when fingerprinting a warning with no parameters' do
|
9
|
-
let(:expected_fingerprint) { 'e68badd29db51c92363a7c6a2438d722' }
|
10
|
-
let(:warning) do
|
11
|
-
Reek::SmellWarning.new(
|
12
|
-
'UtilityFunction',
|
13
|
-
context: 'alfa',
|
14
|
-
message: "doesn't depend on instance state (maybe move it to another class?)",
|
15
|
-
lines: lines,
|
16
|
-
source: 'a/ruby/source/file.rb')
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'with code at a specific location' do
|
20
|
-
let(:lines) { [1] }
|
21
|
-
|
22
|
-
it 'computes the fingerprint' do
|
23
|
-
expect(computed).to eq expected_fingerprint
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'with code at a different location' do
|
28
|
-
let(:lines) { [5] }
|
29
|
-
|
30
|
-
it 'computes the same fingerprint' do
|
31
|
-
expect(computed).to eq expected_fingerprint
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'when the fingerprint should not be computed' do
|
37
|
-
let(:warning) do
|
38
|
-
Reek::SmellWarning.new(
|
39
|
-
'ManualDispatch',
|
40
|
-
context: 'Alfa#bravo',
|
41
|
-
message: 'manually dispatches method call',
|
42
|
-
lines: [4],
|
43
|
-
source: 'a/ruby/source/file.rb')
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'returns nil' do
|
47
|
-
expect(computed).to be_nil
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'when the smell warning has only identifying parameters' do
|
52
|
-
let(:warning) do
|
53
|
-
Reek::SmellWarning.new(
|
54
|
-
'ClassVariable',
|
55
|
-
context: 'Alfa',
|
56
|
-
message: "declares the class variable '@@#{name}'",
|
57
|
-
lines: [4],
|
58
|
-
parameters: { name: "@@#{name}" },
|
59
|
-
source: 'a/ruby/source/file.rb')
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'when the name is one thing' do
|
63
|
-
let(:name) { 'bravo' }
|
64
|
-
let(:expected_fingerprint) { '9c3fd378178118a67e9509f87cae24f9' }
|
65
|
-
|
66
|
-
it 'computes the fingerprint' do
|
67
|
-
expect(computed).to eq expected_fingerprint
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'when the name is another thing' do
|
72
|
-
let(:name) { 'echo' }
|
73
|
-
let(:expected_fingerprint) { 'd2a6d2703ce04cca65e7300b7de4b89f' }
|
74
|
-
|
75
|
-
it 'computes another fingerprint' do
|
76
|
-
expect(computed).to eq expected_fingerprint
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'when the smell warning has identifying and non-identifying parameters' do
|
82
|
-
let(:warning) do
|
83
|
-
Reek::SmellWarning.new(
|
84
|
-
'DuplicateMethodCall',
|
85
|
-
context: "Alfa##{name}",
|
86
|
-
message: "calls '#{name}' #{count} times",
|
87
|
-
lines: lines,
|
88
|
-
parameters: { name: "@@#{name}", count: count },
|
89
|
-
source: 'a/ruby/source/file.rb')
|
90
|
-
end
|
91
|
-
|
92
|
-
context 'when the parameters are provided' do
|
93
|
-
let(:name) { 'bravo' }
|
94
|
-
let(:count) { 5 }
|
95
|
-
let(:lines) { [1, 7, 10, 13, 15] }
|
96
|
-
let(:expected_fingerprint) { '238733f4f51ba5473dcbe94a43ec5400' }
|
97
|
-
|
98
|
-
it 'computes the fingerprint' do
|
99
|
-
expect(computed).to eq expected_fingerprint
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
context 'when the non-identifying parameters change' do
|
104
|
-
let(:name) { 'bravo' }
|
105
|
-
let(:count) { 9 }
|
106
|
-
let(:lines) { [1, 7, 10, 13, 15, 17, 19, 20, 25] }
|
107
|
-
let(:expected_fingerprint) { '238733f4f51ba5473dcbe94a43ec5400' }
|
108
|
-
|
109
|
-
it 'computes the same fingerprint' do
|
110
|
-
expect(computed).to eq expected_fingerprint
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context 'when the identifying parameters change' do
|
115
|
-
let(:name) { 'echo' }
|
116
|
-
let(:count) { 5 }
|
117
|
-
let(:lines) { [1, 7, 10, 13, 15] }
|
118
|
-
let(:expected_fingerprint) { 'e0c35e9223cc19bdb9a04fb3e60573e1' }
|
119
|
-
|
120
|
-
it 'computes a different fingerprint' do
|
121
|
-
expect(computed).to eq expected_fingerprint
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require_relative '../../../spec_helper'
|
2
|
-
require_lib 'reek/report/code_climate/code_climate_formatter'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Report::CodeClimateFormatter do
|
5
|
-
describe '#render' do
|
6
|
-
let(:warning) do
|
7
|
-
Reek::SmellWarning.new(
|
8
|
-
'UtilityFunction',
|
9
|
-
context: 'context foo',
|
10
|
-
message: 'message bar',
|
11
|
-
lines: [1, 2],
|
12
|
-
source: 'a/ruby/source/file.rb')
|
13
|
-
end
|
14
|
-
let(:rendered) { described_class.new(warning).render }
|
15
|
-
let(:json) { JSON.parse rendered.chop }
|
16
|
-
|
17
|
-
it "sets the type as 'issue'" do
|
18
|
-
expect(json['type']).to eq 'issue'
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'sets the category' do
|
22
|
-
expect(json['categories']).to eq ['Complexity']
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'constructs a description based on the context and message' do
|
26
|
-
expect(json['description']).to eq 'context foo message bar'
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'sets a check name based on the smell detector' do
|
30
|
-
expect(json['check_name']).to eq 'UtilityFunction'
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'sets the location' do
|
34
|
-
expect(json['location']).to eq('path' => 'a/ruby/source/file.rb',
|
35
|
-
'lines' => { 'begin' => 1, 'end' => 2 })
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'sets a content based on the smell detector' do
|
39
|
-
expect(json['content']['body']).
|
40
|
-
to eq "A _Utility Function_ is any instance method that has no dependency on the state of the instance.\n"
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'sets remediation points based on the smell detector' do
|
44
|
-
expect(json['remediation_points']).to eq 250_000
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'sets fingerprint based on warning context' do
|
48
|
-
expect(json['fingerprint']).to eq '70c530e45999af129d520f1f579f967f'
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require_relative '../../../spec_helper'
|
2
|
-
require_lib 'reek/examiner'
|
3
|
-
require_lib 'reek/report/code_climate'
|
4
|
-
|
5
|
-
require 'json'
|
6
|
-
require 'stringio'
|
7
|
-
|
8
|
-
RSpec.describe Reek::Report::CodeClimateReport do
|
9
|
-
let(:options) { {} }
|
10
|
-
let(:instance) { described_class.new(**options) }
|
11
|
-
let(:examiner) { Reek::Examiner.new(source) }
|
12
|
-
|
13
|
-
before do
|
14
|
-
instance.add_examiner examiner
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'with empty source' do
|
18
|
-
let(:source) { '' }
|
19
|
-
|
20
|
-
it 'prints an empty string' do
|
21
|
-
expect { instance.show }.to output('').to_stdout
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'with smelly source' do
|
26
|
-
let(:source) { 'def simple(a) a[3] end' }
|
27
|
-
|
28
|
-
it 'prints smells as json' do
|
29
|
-
expected = <<~HERE.delete("\n")
|
30
|
-
{"type":"issue",
|
31
|
-
"check_name":"UncommunicativeParameterName",
|
32
|
-
"description":"simple has the parameter name 'a'",
|
33
|
-
"categories":["Complexity"],
|
34
|
-
"location":{"path":"string","lines":{"begin":1,"end":1}},
|
35
|
-
"remediation_points":150000,
|
36
|
-
"content":{"body":"An `Uncommunicative Parameter Name` is a parameter name that
|
37
|
-
doesn't communicate its intent well enough.\\n\\nPoor names make it hard for the reader
|
38
|
-
to build a mental picture of what's going on in the code. They can also be
|
39
|
-
mis-interpreted; and they hurt the flow of reading, because the reader must slow down
|
40
|
-
to interpret the names.\\n"},
|
41
|
-
"fingerprint":"09970037d92b5a628bf682a3e2bb126d"}\u0000
|
42
|
-
{"type":"issue",
|
43
|
-
"check_name":"UtilityFunction",
|
44
|
-
"description":"simple doesn't depend on instance state (maybe move it to another class?)",
|
45
|
-
"categories":["Complexity"],
|
46
|
-
"location":{"path":"string","lines":{"begin":1,"end":1}},
|
47
|
-
"remediation_points":250000,
|
48
|
-
"content":{"body":"A _Utility Function_ is any instance method that has no
|
49
|
-
dependency on the state of the instance.\\n"},
|
50
|
-
"fingerprint":"db456db7cb344bb5a98b8fc54a2f382e"}\u0000
|
51
|
-
HERE
|
52
|
-
|
53
|
-
expect { instance.show }.to output(expected).to_stdout
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/examiner'
|
3
|
-
require_lib 'reek/report/html_report'
|
4
|
-
|
5
|
-
RSpec.describe Reek::Report::HTMLReport do
|
6
|
-
let(:instance) { described_class.new }
|
7
|
-
|
8
|
-
context 'with an empty source' do
|
9
|
-
let(:examiner) { Reek::Examiner.new('') }
|
10
|
-
|
11
|
-
before do
|
12
|
-
instance.add_examiner examiner
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'has the text 0 total warnings' do
|
16
|
-
expect { instance.show }.to output(/0 total warnings/).to_stdout
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/examiner'
|
3
|
-
require_lib 'reek/report/json_report'
|
4
|
-
|
5
|
-
require 'json'
|
6
|
-
require 'stringio'
|
7
|
-
|
8
|
-
RSpec.describe Reek::Report::JSONReport do
|
9
|
-
let(:options) { {} }
|
10
|
-
let(:instance) { described_class.new(**options) }
|
11
|
-
let(:examiner) { Reek::Examiner.new(source) }
|
12
|
-
|
13
|
-
before do
|
14
|
-
instance.add_examiner examiner
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'with empty source' do
|
18
|
-
let(:source) { '' }
|
19
|
-
|
20
|
-
it 'prints empty json' do
|
21
|
-
expect { instance.show }.to output(/^\[\]$/).to_stdout
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'with smelly source' do
|
26
|
-
let(:source) { 'def simple(a) a[3] end' }
|
27
|
-
|
28
|
-
it 'prints smells as json' do
|
29
|
-
out = StringIO.new
|
30
|
-
instance.show(out)
|
31
|
-
out.rewind
|
32
|
-
result = JSON.parse(out.read)
|
33
|
-
expected = JSON.parse <<-RUBY
|
34
|
-
[
|
35
|
-
{
|
36
|
-
"context": "simple",
|
37
|
-
"lines": [1],
|
38
|
-
"message": "has the parameter name 'a'",
|
39
|
-
"smell_type": "UncommunicativeParameterName",
|
40
|
-
"source": "string",
|
41
|
-
"name": "a",
|
42
|
-
"documentation_link": "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Uncommunicative-Parameter-Name.md"
|
43
|
-
},
|
44
|
-
{
|
45
|
-
"context": "simple",
|
46
|
-
"lines": [1],
|
47
|
-
"message": "doesn't depend on instance state (maybe move it to another class?)",
|
48
|
-
"smell_type": "UtilityFunction",
|
49
|
-
"source": "string",
|
50
|
-
"documentation_link": "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Utility-Function.md"
|
51
|
-
}
|
52
|
-
]
|
53
|
-
RUBY
|
54
|
-
|
55
|
-
expect(result).to eq expected
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/report/location_formatter'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Report::BlankLocationFormatter do
|
5
|
-
let(:warning) { build_smell_warning(lines: [11, 9, 250, 100]) }
|
6
|
-
|
7
|
-
describe '.format' do
|
8
|
-
it 'returns a blank String regardless of the warning' do
|
9
|
-
expect(described_class.format(warning)).to eq('')
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
RSpec.describe Reek::Report::DefaultLocationFormatter do
|
15
|
-
let(:warning) { build_smell_warning(lines: [11, 9, 250, 100]) }
|
16
|
-
|
17
|
-
describe '.format' do
|
18
|
-
it 'returns a prefix with sorted line numbers' do
|
19
|
-
expect(described_class.format(warning)).to eq('[9, 11, 100, 250]:')
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
RSpec.describe Reek::Report::SingleLineLocationFormatter do
|
25
|
-
let(:warning) { build_smell_warning(lines: [11, 9, 250, 100]) }
|
26
|
-
|
27
|
-
describe '.format' do
|
28
|
-
it 'returns the first line where the smell was found' do
|
29
|
-
expect(described_class.format(warning)).to eq('dummy_file:9: ')
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/report/progress_formatter'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Report::ProgressFormatter::Dots do
|
5
|
-
let(:sources_count) { 23 }
|
6
|
-
let(:formatter) { described_class.new(sources_count) }
|
7
|
-
|
8
|
-
describe '#header' do
|
9
|
-
it 'announces the number of files to be inspected' do
|
10
|
-
expect(formatter.header).to eq "Inspecting 23 file(s):\n"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '#progress' do
|
15
|
-
let(:clean_examiner) { instance_double(Reek::Examiner, smelly?: false) }
|
16
|
-
let(:smelly_examiner) { instance_double(Reek::Examiner, smelly?: true) }
|
17
|
-
|
18
|
-
context 'with colors disabled' do
|
19
|
-
before do
|
20
|
-
Rainbow.enabled = false
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'returns a dot for clean files' do
|
24
|
-
expect(formatter.progress(clean_examiner)).to eq '.'
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'returns an S for smelly files' do
|
28
|
-
expect(formatter.progress(smelly_examiner)).to eq 'S'
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '#footer' do
|
34
|
-
it 'returns some blank lines to offset the output' do
|
35
|
-
expect(formatter.footer).to eq "\n\n"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
RSpec.describe Reek::Report::ProgressFormatter::Quiet do
|
41
|
-
let(:sources_count) { 23 }
|
42
|
-
let(:formatter) { described_class.new(sources_count) }
|
43
|
-
|
44
|
-
describe '#header' do
|
45
|
-
it 'is quiet' do
|
46
|
-
expect(formatter.header).to eq ''
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe '#progress' do
|
51
|
-
let(:clean_examiner) { instance_double(Reek::Examiner, smelly?: false) }
|
52
|
-
let(:smelly_examiner) { instance_double(Reek::Examiner, smelly?: true) }
|
53
|
-
|
54
|
-
it 'is quiet for clean files' do
|
55
|
-
expect(formatter.progress(clean_examiner)).to eq ''
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'is quiet for smelly files' do
|
59
|
-
expect(formatter.progress(smelly_examiner)).to eq ''
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe '#footer' do
|
64
|
-
it 'is quiet' do
|
65
|
-
expect(formatter.footer).to eq ''
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/examiner'
|
3
|
-
require_lib 'reek/report/text_report'
|
4
|
-
require_lib 'reek/report/heading_formatter'
|
5
|
-
require_lib 'reek/report/simple_warning_formatter'
|
6
|
-
require 'rainbow'
|
7
|
-
|
8
|
-
RSpec.describe Reek::Report::TextReport do
|
9
|
-
let(:instance) { described_class.new }
|
10
|
-
|
11
|
-
context 'with a single empty source' do
|
12
|
-
before do
|
13
|
-
instance.add_examiner Reek::Examiner.new('')
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'has an empty quiet_report' do
|
17
|
-
expect { instance.show }.not_to output.to_stdout
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'with non smelly files' do
|
22
|
-
before do
|
23
|
-
instance.add_examiner(Reek::Examiner.new('def simple() puts "a" end'))
|
24
|
-
instance.add_examiner(Reek::Examiner.new('def simple() puts "a" end'))
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'with colors disabled' do
|
28
|
-
before do
|
29
|
-
Rainbow.enabled = false
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'shows total of 0 warnings' do
|
33
|
-
expect { instance.show }.to output(/0 total warnings\n\Z/).to_stdout
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'with colors enabled' do
|
38
|
-
before do
|
39
|
-
Rainbow.enabled = true
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'has a footer in color' do
|
43
|
-
expect { instance.show }.to output(/\e\[32m0 total warnings\n\e\[0m\Z/).to_stdout
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'with a couple of smells' do
|
49
|
-
before do
|
50
|
-
instance.add_examiner(Reek::Examiner.new('def simple(a) a[3] end'))
|
51
|
-
instance.add_examiner(Reek::Examiner.new('def simple(a) a[3] end'))
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'with colors disabled' do
|
55
|
-
before do
|
56
|
-
Rainbow.enabled = false
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'has a heading' do
|
60
|
-
expect { instance.show }.to output(/string -- 2 warnings/).to_stdout
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'mentions every smell name' do
|
64
|
-
matcher = match(/UncommunicativeParameterName/).and match(/UtilityFunction/)
|
65
|
-
expect { instance.show }.to output(matcher).to_stdout
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'shows total number of warnings' do
|
69
|
-
expect { instance.show }.to output(/4 total warnings\n\Z/).to_stdout
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'with colors enabled' do
|
74
|
-
before do
|
75
|
-
Rainbow.enabled = true
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'has a header in color' do
|
79
|
-
expect { instance.show }.
|
80
|
-
to output(/\A\e\[36mstring -- \e\[0m\e\[33m2 warning\e\[0m\e\[33ms\e\[0m/).to_stdout
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'shows total number of warnings in color' do
|
84
|
-
expect { instance.show }.
|
85
|
-
to output(/\e\[31m4 total warnings\n\e\[0m\Z/).to_stdout
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|