reek 6.0.2 → 6.1.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/.github/dependabot.yml +13 -0
- data/.github/workflows/ruby.yml +57 -0
- data/.rubocop.yml +6 -4
- data/.rubocop_todo.yml +6 -4
- data/CHANGELOG.md +42 -0
- data/CONTRIBUTING.md +4 -1
- data/Dockerfile +1 -1
- data/Gemfile +7 -7
- data/README.md +2 -2
- data/bin/code_climate_reek +2 -3
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/ast/node.rb +1 -1
- data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
- data/lib/reek/ast/sexp_extensions/case.rb +1 -1
- data/lib/reek/ast/sexp_extensions/if.rb +1 -1
- data/lib/reek/ast/sexp_extensions/send.rb +1 -1
- data/lib/reek/cli/command/todo_list_command.rb +2 -2
- data/lib/reek/cli/options.rb +6 -6
- data/lib/reek/code_comment.rb +22 -17
- data/lib/reek/configuration/configuration_file_finder.rb +2 -1
- data/lib/reek/configuration/excluded_paths.rb +2 -1
- data/lib/reek/context/code_context.rb +1 -1
- data/lib/reek/context/module_context.rb +4 -0
- data/lib/reek/context/refinement_context.rb +16 -0
- data/lib/reek/context/send_context.rb +6 -0
- data/lib/reek/context_builder.rb +17 -3
- data/lib/reek/rake/task.rb +5 -5
- data/lib/reek/report/code_climate/code_climate_configuration.yml +3 -3
- 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_detectors/class_variable.rb +2 -2
- data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
- data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
- data/lib/reek/smell_detectors/unused_private_method.rb +1 -0
- data/lib/reek/smell_warning.rb +1 -1
- data/lib/reek/source/source_locator.rb +1 -3
- data/lib/reek/spec/should_reek_of.rb +11 -9
- data/lib/reek/spec.rb +1 -1
- data/lib/reek/version.rb +2 -2
- data/reek.gemspec +28 -25
- metadata +13 -240
- data/.travis.yml +0 -40
- 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 -37
- 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 -16
- 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 -293
- 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,192 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/context/method_context'
|
|
3
|
-
require_lib 'reek/context/module_context'
|
|
4
|
-
|
|
5
|
-
RSpec.describe Reek::Context::CodeContext do
|
|
6
|
-
describe '#full_name' do
|
|
7
|
-
let(:ctx) { described_class.new(exp) }
|
|
8
|
-
let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
|
|
9
|
-
let(:exp_name) { 'random_name' }
|
|
10
|
-
let(:full_name) { "::::::::::::::::::::#{exp_name}" }
|
|
11
|
-
|
|
12
|
-
before do
|
|
13
|
-
allow(exp).to receive(:name).and_return(exp_name)
|
|
14
|
-
allow(exp).to receive(:full_name).and_return(full_name)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it 'creates the correct full name' do
|
|
18
|
-
expect(ctx.full_name).to eq(full_name)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
context 'when there is an outer' do
|
|
22
|
-
let(:outer_name) { 'another_random sting' }
|
|
23
|
-
let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
24
|
-
|
|
25
|
-
before do
|
|
26
|
-
ctx.register_with_parent outer
|
|
27
|
-
allow(outer).to receive(:full_name).at_least(:once).and_return(outer_name)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'creates the correct full name' do
|
|
31
|
-
expect(ctx.full_name).to eq(full_name)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it 'passes the outer name to exp#full_name' do
|
|
35
|
-
ctx.full_name
|
|
36
|
-
expect(exp).to have_received(:full_name).with outer_name
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
describe '#name' do
|
|
42
|
-
let(:ctx) { described_class.new(exp) }
|
|
43
|
-
let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
|
|
44
|
-
let(:exp_name) { 'random_name' }
|
|
45
|
-
|
|
46
|
-
before do
|
|
47
|
-
allow(exp).to receive(:name).and_return(exp_name)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it 'gets its short name from the exp' do
|
|
51
|
-
expect(ctx.name).to eq(exp_name)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
describe '#matches?' do
|
|
56
|
-
let(:ctx) { described_class.new(exp) }
|
|
57
|
-
let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
|
|
58
|
-
let(:exp_name) { 'random_name' }
|
|
59
|
-
let(:full_name) { "::::::::::::::::::::#{exp_name}" }
|
|
60
|
-
|
|
61
|
-
before do
|
|
62
|
-
allow(exp).to receive(:name).and_return(exp_name)
|
|
63
|
-
allow(exp).to receive(:full_name).and_return(full_name)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it 'does not match an empty list' do
|
|
67
|
-
expect(ctx.matches?([])).to eq(false)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it 'does not match when its own short name is not given' do
|
|
71
|
-
expect(ctx.matches?(['banana'])).to eq(false)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it 'does not let pipe-ended Strings make matching ignore the rest' do
|
|
75
|
-
expect(ctx.matches?(['banana|'])).to eq(false)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
it 'recognises its own short name' do
|
|
79
|
-
expect(ctx.matches?([exp_name])).to eq(true)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it 'recognises its own short name in a list' do
|
|
83
|
-
expect(ctx.matches?(['banana', exp_name])).to eq(true)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it 'recognises its short name as a regex' do
|
|
87
|
-
expect(ctx.matches?([/#{exp_name}/])).to eq(true)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
it 'does not blow up on []-ended Strings' do
|
|
91
|
-
expect(ctx.matches?(['banana[]', exp_name])).to eq(true)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
it 'recognises its own full name' do
|
|
95
|
-
expect(ctx.matches?(['banana', full_name])).to eq(true)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it 'recognises its full name as a regex' do
|
|
99
|
-
expect(ctx.matches?([/banana/, /#{full_name}/])).to eq(true)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
context 'when there is an outer' do
|
|
103
|
-
let(:outer_name) { 'another_random sting' }
|
|
104
|
-
let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
105
|
-
|
|
106
|
-
before do
|
|
107
|
-
ctx.register_with_parent outer
|
|
108
|
-
allow(outer).to receive(:full_name).at_least(:once).and_return(outer_name)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it 'recognises its own full name' do
|
|
112
|
-
expect(ctx.matches?(['banana', full_name])).to eq(true)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it 'recognises its full name as a regex' do
|
|
116
|
-
expect(ctx.matches?([/banana/, /#{full_name}/])).to eq(true)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
describe '#config_for' do
|
|
122
|
-
let(:src) do
|
|
123
|
-
<<-RUBY
|
|
124
|
-
# :reek:DuplicateMethodCall { allow_calls: [ puts ] }')
|
|
125
|
-
def repeated_greeting
|
|
126
|
-
puts 'Hello!'
|
|
127
|
-
puts 'Hello!'
|
|
128
|
-
end
|
|
129
|
-
RUBY
|
|
130
|
-
end
|
|
131
|
-
let(:expression) { Reek::Source::SourceCode.from(src).syntax_tree }
|
|
132
|
-
let(:outer) { nil }
|
|
133
|
-
let(:context) { described_class.new(expression) }
|
|
134
|
-
let(:sniffer) { class_double('Reek::SmellDetectors::BaseDetector') }
|
|
135
|
-
|
|
136
|
-
before do
|
|
137
|
-
context.register_with_parent(outer)
|
|
138
|
-
allow(sniffer).to receive(:smell_type).and_return('DuplicateMethodCall')
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
context 'when there is no outer context' do
|
|
142
|
-
it 'gets its configuration from the expression comments' do
|
|
143
|
-
expect(context.config_for(sniffer)).to eq('allow_calls' => ['puts'])
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
context 'when there is an outer context' do
|
|
148
|
-
let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
149
|
-
|
|
150
|
-
before do
|
|
151
|
-
allow(outer).to receive(:config_for).with(sniffer).and_return(
|
|
152
|
-
'max_calls' => 2)
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
it 'merges the outer config with its own configuration' do
|
|
156
|
-
expect(context.config_for(sniffer)).to eq('allow_calls' => ['puts'],
|
|
157
|
-
'max_calls' => 2)
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
describe '#register_with_parent' do
|
|
163
|
-
let(:context) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
164
|
-
let(:first_child) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
165
|
-
let(:second_child) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
166
|
-
|
|
167
|
-
it "appends the element to the parent context's list of children" do
|
|
168
|
-
first_child.register_with_parent context
|
|
169
|
-
second_child.register_with_parent context
|
|
170
|
-
|
|
171
|
-
expect(context.children).to eq [first_child, second_child]
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
describe '#each' do
|
|
176
|
-
let(:context) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
177
|
-
let(:first_child) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
178
|
-
let(:second_child) { described_class.new(instance_double('Reek::AST::Node')) }
|
|
179
|
-
|
|
180
|
-
it 'yields each child' do
|
|
181
|
-
first_child.register_with_parent context
|
|
182
|
-
second_child.register_with_parent context
|
|
183
|
-
|
|
184
|
-
result = []
|
|
185
|
-
context.each do |ctx|
|
|
186
|
-
result << ctx
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
expect(result).to eq [context, first_child, second_child]
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
end
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/context/code_context'
|
|
3
|
-
require_lib 'reek/context/ghost_context'
|
|
4
|
-
|
|
5
|
-
RSpec.describe Reek::Context::GhostContext do
|
|
6
|
-
let(:exp) { instance_double('Reek::AST::Node') }
|
|
7
|
-
let(:parent) { Reek::Context::CodeContext.new(exp) }
|
|
8
|
-
|
|
9
|
-
describe '#register_with_parent' do
|
|
10
|
-
it 'does not append itself to its parent' do
|
|
11
|
-
ghost = described_class.new(nil)
|
|
12
|
-
ghost.register_with_parent(parent)
|
|
13
|
-
expect(parent.children).not_to include ghost
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#append_child_context' do
|
|
18
|
-
let(:ghost) { described_class.new(nil) }
|
|
19
|
-
|
|
20
|
-
before do
|
|
21
|
-
ghost.register_with_parent(parent)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it 'appends the child to the grandparent context' do
|
|
25
|
-
child = Reek::Context::CodeContext.new(sexp(:foo))
|
|
26
|
-
child.register_with_parent(ghost)
|
|
27
|
-
|
|
28
|
-
expect(parent.children).to include child
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "sets the child's parent to the grandparent context" do
|
|
32
|
-
child = Reek::Context::CodeContext.new(sexp(:foo))
|
|
33
|
-
child.register_with_parent(ghost)
|
|
34
|
-
|
|
35
|
-
expect(child.parent).to eq parent
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it 'appends the child to the list of children' do
|
|
39
|
-
child = Reek::Context::CodeContext.new(sexp(:foo))
|
|
40
|
-
child.register_with_parent(ghost)
|
|
41
|
-
|
|
42
|
-
expect(ghost.children).to include child
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
context 'when the grandparent is also a ghost' do
|
|
46
|
-
let(:child_ghost) { described_class.new(nil) }
|
|
47
|
-
|
|
48
|
-
before do
|
|
49
|
-
child_ghost.register_with_parent(ghost)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it 'sets the childs parent to its remote ancestor' do
|
|
53
|
-
child = Reek::Context::CodeContext.new(sexp(:foo))
|
|
54
|
-
child.register_with_parent(child_ghost)
|
|
55
|
-
|
|
56
|
-
expect(child.parent).to eq parent
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/context/method_context'
|
|
3
|
-
|
|
4
|
-
RSpec.describe Reek::Context::MethodContext do
|
|
5
|
-
let(:method_context) { described_class.new(exp, nil) }
|
|
6
|
-
|
|
7
|
-
describe '#matches?' do
|
|
8
|
-
let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode').as_null_object }
|
|
9
|
-
|
|
10
|
-
before do
|
|
11
|
-
allow(exp).to receive(:full_name).at_least(:once).and_return('mod')
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
it 'recognises itself in a collection of names' do
|
|
15
|
-
expect(method_context.matches?(['banana', 'mod'])).to eq(true)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it 'does not recognise itself in a collection of names that does not include it' do
|
|
19
|
-
expect(method_context.matches?(['banana'])).to eq(false)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it 'recognises itself in a collection of regular expressions' do
|
|
23
|
-
expect(method_context.matches?([/banana/, /mod/])).to eq(true)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it 'does not recognise itself in a collection of regular expressions that do not match it' do
|
|
27
|
-
expect(method_context.matches?([/banana/])).to eq(false)
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
describe '#default_assignments' do
|
|
32
|
-
def assignments_from(src)
|
|
33
|
-
exp = Reek::Source::SourceCode.from(src).syntax_tree
|
|
34
|
-
ctx = Reek::Context::MethodContext.new(exp, nil)
|
|
35
|
-
ctx.default_assignments
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
context 'with no defaults' do
|
|
39
|
-
it 'returns an empty hash' do
|
|
40
|
-
src = 'def meth(arga, argb, &blk) end'
|
|
41
|
-
expect(assignments_from(src)).to be_empty
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
context 'with 1 default' do
|
|
46
|
-
let(:defaults) { assignments_from('def meth(arga, argb=456, &blk) end') }
|
|
47
|
-
|
|
48
|
-
it 'returns the param-value pair' do
|
|
49
|
-
expect(defaults[0]).to eq [:argb, sexp(:int, 456)]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it 'returns the nothing else' do
|
|
53
|
-
expect(defaults.length).to eq(1)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
context 'with 2 defaults' do
|
|
58
|
-
let(:defaults) do
|
|
59
|
-
assignments_from('def meth(arga=123, argb=456, &blk) end')
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it 'returns both param-value pairs' do
|
|
63
|
-
expect(defaults).to eq [[:arga, sexp(:int, 123)],
|
|
64
|
-
[:argb, sexp(:int, 456)]]
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it 'returns nothing else' do
|
|
68
|
-
expect(defaults.length).to eq(2)
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/context/module_context'
|
|
3
|
-
require_lib 'reek/context/root_context'
|
|
4
|
-
|
|
5
|
-
RSpec.describe Reek::Context::ModuleContext do
|
|
6
|
-
it 'reports module name for smell in method' do
|
|
7
|
-
expect('
|
|
8
|
-
module Fred
|
|
9
|
-
def simple(x) x + 1; end
|
|
10
|
-
end
|
|
11
|
-
').to reek_of(:UncommunicativeParameterName, name: 'x', context: 'Fred#simple')
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
it 'does not report module with empty class' do
|
|
15
|
-
expect('
|
|
16
|
-
# module for test
|
|
17
|
-
module Fred
|
|
18
|
-
# module for test
|
|
19
|
-
class Jim; end; end').not_to reek
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it 'recognises global constant' do
|
|
23
|
-
expect('
|
|
24
|
-
# module for test
|
|
25
|
-
module ::Global
|
|
26
|
-
# module for test
|
|
27
|
-
class Inside; end; end').not_to reek
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
describe '#track_visibility' do
|
|
31
|
-
let(:main_exp) { instance_double('Reek::AST::Node') }
|
|
32
|
-
let(:first_def) { instance_double('Reek::AST::SexpExtensions::DefNode', name: :foo) }
|
|
33
|
-
let(:second_def) { instance_double('Reek::AST::SexpExtensions::DefNode') }
|
|
34
|
-
|
|
35
|
-
let(:context) { described_class.new(main_exp) }
|
|
36
|
-
let(:first_child) { Reek::Context::MethodContext.new(first_def, main_exp) }
|
|
37
|
-
let(:second_child) { Reek::Context::MethodContext.new(second_def, main_exp) }
|
|
38
|
-
|
|
39
|
-
it 'sets visibility on subsequent child contexts' do
|
|
40
|
-
context.append_child_context first_child
|
|
41
|
-
context.track_visibility :private, []
|
|
42
|
-
context.append_child_context second_child
|
|
43
|
-
expect(first_child.visibility).to eq :public
|
|
44
|
-
expect(second_child.visibility).to eq :private
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it 'sets visibility on specifically mentioned child contexts' do
|
|
48
|
-
context.append_child_context first_child
|
|
49
|
-
context.track_visibility :private, [first_child.name]
|
|
50
|
-
context.append_child_context second_child
|
|
51
|
-
expect(first_child.visibility).to eq :private
|
|
52
|
-
expect(second_child.visibility).to eq :public
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/context/root_context'
|
|
3
|
-
|
|
4
|
-
RSpec.describe Reek::Context::RootContext do
|
|
5
|
-
describe '#full_name' do
|
|
6
|
-
it 'reports full context' do
|
|
7
|
-
ast = Reek::Source::SourceCode.from('foo = 1').syntax_tree
|
|
8
|
-
root = described_class.new(ast)
|
|
9
|
-
expect(root.full_name).to eq('')
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/context/statement_counter'
|
|
3
|
-
|
|
4
|
-
RSpec.describe Reek::Context::StatementCounter do
|
|
5
|
-
let(:counter) { described_class.new }
|
|
6
|
-
|
|
7
|
-
describe '#increase_by' do
|
|
8
|
-
it 'does not increase if passed a falsy value' do
|
|
9
|
-
counter.increase_by(nil)
|
|
10
|
-
expect(counter.value).to eq 0
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'increase by the lengh of the passed in argument' do
|
|
14
|
-
counter.increase_by([1, 2, 3])
|
|
15
|
-
expect(counter.value).to eq 3
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it 'accumulates increases' do
|
|
19
|
-
counter.increase_by([1, 2, 3])
|
|
20
|
-
counter.increase_by([1, 2, 3])
|
|
21
|
-
expect(counter.value).to eq 6
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|