reek 6.0.2 → 6.2.0
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 -12
- data/.rubocop_todo.yml +6 -4
- data/CHANGELOG.md +95 -0
- data/CONTRIBUTING.md +10 -10
- data/Dockerfile +1 -1
- data/Gemfile +8 -7
- data/README.md +29 -29
- data/bin/code_climate_reek +56 -8
- 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 +22 -7
- data/lib/reek/cli/command/todo_list_command.rb +3 -3
- data/lib/reek/cli/options.rb +6 -6
- data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
- data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
- data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
- data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
- data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
- data/lib/reek/code_comment.rb +25 -20
- data/lib/reek/configuration/app_configuration.rb +5 -5
- data/lib/reek/configuration/configuration_converter.rb +1 -1
- data/lib/reek/configuration/configuration_file_finder.rb +5 -4
- data/lib/reek/configuration/default_directive.rb +1 -1
- data/lib/reek/configuration/directory_directives.rb +1 -1
- data/lib/reek/configuration/excluded_paths.rb +3 -2
- data/lib/reek/configuration/schema.rb +177 -0
- data/lib/reek/configuration/schema_validator.rb +12 -13
- data/lib/reek/context/attribute_context.rb +1 -1
- data/lib/reek/context/code_context.rb +1 -1
- data/lib/reek/context/method_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 +7 -1
- data/lib/reek/context_builder.rb +17 -3
- data/lib/reek/documentation_link.rb +3 -5
- data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
- data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
- data/lib/reek/errors/encoding_error.rb +1 -1
- data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
- data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
- data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
- data/lib/reek/errors/syntax_error.rb +1 -1
- data/lib/reek/rake/task.rb +5 -5
- 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/control_parameter_helpers/control_parameter_finder.rb +1 -1
- data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
- data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
- data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
- data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
- 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 +29 -25
- metadata +37 -250
- 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/lib/reek/configuration/schema.yml +0 -210
- 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
- /data/lib/reek/{report/code_climate.rb → code_climate.rb} +0 -0
|
@@ -1,498 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/ast/sexp_extensions'
|
|
3
|
-
|
|
4
|
-
RSpec.describe Reek::AST::SexpExtensions::DefNode do
|
|
5
|
-
context 'with no parameters' do
|
|
6
|
-
let(:node) { sexp(:def, :hello, sexp(:args)) }
|
|
7
|
-
|
|
8
|
-
it 'has no arg names' do
|
|
9
|
-
expect(node.arg_names).to eq []
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it 'has no parameter names' do
|
|
13
|
-
expect(node.parameter_names).to eq []
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it 'includes outer scope in its full name' do
|
|
17
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
21
|
-
expect(node.full_name('')).to eq 'hello'
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
context 'with 1 parameter' do
|
|
26
|
-
let(:node) do
|
|
27
|
-
sexp(:def, :hello,
|
|
28
|
-
sexp(:args, sexp(:arg, :parameter)))
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it 'has 1 arg name' do
|
|
32
|
-
expect(node.arg_names).to eq [:parameter]
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it 'has 1 parameter name' do
|
|
36
|
-
expect(node.parameter_names).to eq [:parameter]
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it 'includes outer scope in its full name' do
|
|
40
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
44
|
-
expect(node.full_name('')).to eq 'hello'
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
context 'with a block parameter' do
|
|
49
|
-
let(:node) do
|
|
50
|
-
sexp(:def, :hello,
|
|
51
|
-
sexp(:args,
|
|
52
|
-
sexp(:arg, :parameter),
|
|
53
|
-
sexp(:blockarg, :blk)))
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it 'has 1 arg name' do
|
|
57
|
-
expect(node.arg_names).to eq [:parameter]
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
it 'has 2 parameter names' do
|
|
61
|
-
expect(node.parameter_names).to eq [:parameter, :blk]
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it 'includes outer scope in its full name' do
|
|
65
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
69
|
-
expect(node.full_name('')).to eq 'hello'
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
context 'with 1 defaulted parameter' do
|
|
74
|
-
let(:node) do
|
|
75
|
-
sexp(:def, :hello,
|
|
76
|
-
sexp(:args,
|
|
77
|
-
sexp(:optarg, :parameter, sexp(:array))))
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it 'has 1 arg name' do
|
|
81
|
-
expect(node.arg_names).to eq [:parameter]
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
it 'has 1 parameter name' do
|
|
85
|
-
expect(node.parameter_names).to eq [:parameter]
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it 'includes outer scope in its full name' do
|
|
89
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
93
|
-
expect(node.full_name('')).to eq 'hello'
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
context 'with a body with 2 statements' do
|
|
98
|
-
let(:node) do
|
|
99
|
-
sexp(:def, :hello, sexp(:args),
|
|
100
|
-
sexp(:begin,
|
|
101
|
-
sexp(:first),
|
|
102
|
-
sexp(:second)))
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
it 'has 2 body statements' do
|
|
106
|
-
expect(node.body).to eq sexp(:begin, sexp(:first), sexp(:second))
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
it 'finds nodes in the body with #body_nodes' do
|
|
110
|
-
expect(node.body_nodes([:first]).to_a).to eq [sexp(:first)]
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
context 'with no body' do
|
|
115
|
-
let(:node) { sexp(:def, :hello, sexp(:args), nil) }
|
|
116
|
-
|
|
117
|
-
it 'has a body that is nil' do
|
|
118
|
-
expect(node.body).to be_nil
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
it 'finds no nodes in the body' do
|
|
122
|
-
expect(node.body_nodes([:foo])).to eq []
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
RSpec.describe Reek::AST::SexpExtensions::CSendNode do
|
|
128
|
-
let(:node) { Reek::Source::SourceCode.from('1&.foo(true)').syntax_tree }
|
|
129
|
-
|
|
130
|
-
it 'has a class including SendNode' do
|
|
131
|
-
expect(node.class.included_modules).to include(Reek::AST::SexpExtensions::SendNode)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
it 'has a receiver' do
|
|
135
|
-
expect(node.receiver).to eq(sexp(:int, 1))
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
it 'has a name' do
|
|
139
|
-
expect(node.name).to eq(:foo)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it 'has arguments' do
|
|
143
|
-
expect(node.args).to eq([sexp(:true)])
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
RSpec.describe Reek::AST::SexpExtensions::DefsNode do
|
|
148
|
-
context 'with no parameters' do
|
|
149
|
-
let(:node) { sexp(:defs, sexp(:lvar, :obj), :hello, sexp(:args)) }
|
|
150
|
-
|
|
151
|
-
it 'has no arg names' do
|
|
152
|
-
expect(node.arg_names).to eq []
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
it 'has no parameter names' do
|
|
156
|
-
expect(node.parameter_names).to eq []
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
it 'includes outer scope in its full name' do
|
|
160
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
164
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
context 'with 1 parameter' do
|
|
169
|
-
let(:node) do
|
|
170
|
-
sexp(:defs, sexp(:lvar, :obj), :hello,
|
|
171
|
-
sexp(:args, sexp(:arg, :parameter)))
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
it 'has 1 arg name' do
|
|
175
|
-
expect(node.arg_names).to eq [:parameter]
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it 'has 1 parameter name' do
|
|
179
|
-
expect(node.parameter_names).to eq [:parameter]
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
it 'includes outer scope in its full name' do
|
|
183
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
187
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
|
188
|
-
end
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
context 'with a block' do
|
|
192
|
-
let(:node) do
|
|
193
|
-
sexp(:defs, sexp(:lvar, :obj), :hello,
|
|
194
|
-
sexp(:args,
|
|
195
|
-
sexp(:arg, :parameter),
|
|
196
|
-
sexp(:blockarg, :blk)))
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
it 'has 1 arg name' do
|
|
200
|
-
expect(node.arg_names).to eq [:parameter]
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
it 'has 2 parameter names' do
|
|
204
|
-
expect(node.parameter_names).to eq [:parameter, :blk]
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
it 'includes outer scope in its full name' do
|
|
208
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
212
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
context 'with 1 defaulted parameter' do
|
|
217
|
-
let(:node) do
|
|
218
|
-
sexp(:defs, sexp(:lvar, :obj), :hello,
|
|
219
|
-
sexp(:args,
|
|
220
|
-
sexp(:optarg, :parameter, sexp(:array))))
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
it 'has 1 arg name' do
|
|
224
|
-
expect(node.arg_names).to eq [:parameter]
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it 'has 1 parameter name' do
|
|
228
|
-
expect(node.parameter_names).to eq [:parameter]
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
it 'includes outer scope in its full name' do
|
|
232
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
it 'includes no marker in its full name with empty outer scope' do
|
|
236
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
context 'with a body with 2 statements' do
|
|
241
|
-
let(:node) do
|
|
242
|
-
sexp(:defs, sexp(:self), :hello, sexp(:args),
|
|
243
|
-
sexp(:begin,
|
|
244
|
-
sexp(:first),
|
|
245
|
-
sexp(:second)))
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
it 'has 2 body statements' do
|
|
249
|
-
expect(node.body).to eq sexp(:begin, sexp(:first), sexp(:second))
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
RSpec.describe Reek::AST::SexpExtensions::LvarNode do
|
|
255
|
-
let(:node) { sexp(:lvar, :foo) }
|
|
256
|
-
|
|
257
|
-
describe '#var_name' do
|
|
258
|
-
it 'returns the lvar’s name' do
|
|
259
|
-
expect(node.var_name).to eq(:foo)
|
|
260
|
-
end
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
RSpec.describe Reek::AST::SexpExtensions::ConstNode do
|
|
265
|
-
describe '#name' do
|
|
266
|
-
it 'returns the fully qualified name' do
|
|
267
|
-
node = sexp(:const, sexp(:const, sexp(:cbase), :Parser), :AST)
|
|
268
|
-
|
|
269
|
-
expect(node.name).to eq "#{sexp(:const, sexp(:cbase), :Parser)}::AST"
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
it 'returns only the name in case of no namespace' do
|
|
273
|
-
node = sexp(:const, nil, :AST)
|
|
274
|
-
|
|
275
|
-
expect(node.name).to eq 'AST'
|
|
276
|
-
end
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
describe '#simple_name' do
|
|
280
|
-
it 'returns the name' do
|
|
281
|
-
node = sexp(:const, sexp(:const, nil, :Rake), :TaskLib)
|
|
282
|
-
|
|
283
|
-
expect(node.simple_name).to eq :TaskLib
|
|
284
|
-
end
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
describe '#namespace' do
|
|
288
|
-
it 'returns the namespace' do
|
|
289
|
-
node = sexp(:const, :Parser, :AST)
|
|
290
|
-
|
|
291
|
-
expect(node.namespace).to eq :Parser
|
|
292
|
-
end
|
|
293
|
-
|
|
294
|
-
it 'returns nil in case of no namespace' do
|
|
295
|
-
node = sexp(:const, nil, :AST)
|
|
296
|
-
|
|
297
|
-
expect(node.namespace).to be_nil
|
|
298
|
-
end
|
|
299
|
-
end
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
RSpec.describe Reek::AST::SexpExtensions::SendNode do
|
|
303
|
-
context 'with no parameters' do
|
|
304
|
-
let(:node) { sexp(:send, nil, :hello) }
|
|
305
|
-
|
|
306
|
-
it 'is not considered to be a writable attr' do
|
|
307
|
-
expect(sexp(:send, nil, :attr)).not_to be_attr_with_writable_flag
|
|
308
|
-
end
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
context 'when it’s ‘new’ with no parameters and no receiver' do
|
|
312
|
-
let(:bare_new) { sexp(:send, nil, :new) }
|
|
313
|
-
|
|
314
|
-
it 'is not considered to be a module creation call' do
|
|
315
|
-
expect(bare_new).not_to be_module_creation_call
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
it 'is not considered to have a module creation receiver' do
|
|
319
|
-
expect(bare_new).not_to be_module_creation_receiver
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
it 'is considered to be an object creation call' do
|
|
323
|
-
expect(bare_new).to be_object_creation_call
|
|
324
|
-
end
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
context 'when it’s ‘new’ with a complex receiver' do
|
|
328
|
-
let(:node) { Reek::Source::SourceCode.from('(foo ? bar : baz).new').syntax_tree }
|
|
329
|
-
|
|
330
|
-
it 'is not considered to be a module creation call' do
|
|
331
|
-
expect(node).not_to be_module_creation_call
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
it 'is not considered to have a module creation receiver' do
|
|
335
|
-
expect(node).not_to be_module_creation_receiver
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
it 'is considered to be an object creation call' do
|
|
339
|
-
expect(node).to be_object_creation_call
|
|
340
|
-
end
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
RSpec.describe Reek::AST::SexpExtensions::BlockNode do
|
|
345
|
-
context 'with no parameters' do
|
|
346
|
-
let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args), nil) }
|
|
347
|
-
|
|
348
|
-
it 'has no parameter names' do
|
|
349
|
-
expect(node.parameter_names).to eq []
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
it 'has a name' do
|
|
353
|
-
expect(node.simple_name).to eq(:block)
|
|
354
|
-
end
|
|
355
|
-
end
|
|
356
|
-
|
|
357
|
-
context 'with 1 parameter' do
|
|
358
|
-
let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args, :parameter), nil) }
|
|
359
|
-
|
|
360
|
-
it 'has 1 parameter name' do
|
|
361
|
-
expect(node.parameter_names).to eq [:parameter]
|
|
362
|
-
end
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
context 'with 2 parameters' do
|
|
366
|
-
let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args, :x, :y), nil) }
|
|
367
|
-
|
|
368
|
-
it 'has 2 parameter names' do
|
|
369
|
-
expect(node.parameter_names).to eq [:x, :y]
|
|
370
|
-
end
|
|
371
|
-
end
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
RSpec.describe Reek::AST::SexpExtensions::LambdaNode do
|
|
375
|
-
let(:node) { sexp(:lambda) }
|
|
376
|
-
|
|
377
|
-
describe '#name' do
|
|
378
|
-
it 'returns :lambda' do
|
|
379
|
-
expect(node.name).to eq 'lambda'
|
|
380
|
-
end
|
|
381
|
-
end
|
|
382
|
-
end
|
|
383
|
-
|
|
384
|
-
RSpec.describe Reek::AST::SexpExtensions::ModuleNode do
|
|
385
|
-
context 'with a simple name' do
|
|
386
|
-
let(:exp) do
|
|
387
|
-
Reek::Source::SourceCode.from('module Fred; end').syntax_tree
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
it 'has the correct #name' do
|
|
391
|
-
expect(exp.name).to eq 'Fred'
|
|
392
|
-
end
|
|
393
|
-
|
|
394
|
-
it 'has the correct #simple_name' do
|
|
395
|
-
expect(exp.simple_name).to eq 'Fred'
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
it 'has a simple full_name' do
|
|
399
|
-
expect(exp.full_name('')).to eq 'Fred'
|
|
400
|
-
end
|
|
401
|
-
|
|
402
|
-
it 'has a fq full_name' do
|
|
403
|
-
expect(exp.full_name('Blimey::O::Reilly')).to eq 'Blimey::O::Reilly::Fred'
|
|
404
|
-
end
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
context 'with a scoped name' do
|
|
408
|
-
let(:exp) do
|
|
409
|
-
Reek::Source::SourceCode.from('module Foo::Bar; end').syntax_tree
|
|
410
|
-
end
|
|
411
|
-
|
|
412
|
-
it 'has the correct #name' do
|
|
413
|
-
expect(exp.name).to eq 'Foo::Bar'
|
|
414
|
-
end
|
|
415
|
-
|
|
416
|
-
it 'has the correct #simple_name' do
|
|
417
|
-
expect(exp.simple_name).to eq 'Bar'
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
it 'has a simple full_name' do
|
|
421
|
-
expect(exp.full_name('')).to eq 'Foo::Bar'
|
|
422
|
-
end
|
|
423
|
-
|
|
424
|
-
it 'has a fully qualified full_name' do
|
|
425
|
-
expect(exp.full_name('Blimey::O::Reilly')).to eq 'Blimey::O::Reilly::Foo::Bar'
|
|
426
|
-
end
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
context 'with a name scoped in a namespace that is not a constant' do
|
|
430
|
-
let(:exp) do
|
|
431
|
-
Reek::Source::SourceCode.from('module foo::Bar; end').syntax_tree
|
|
432
|
-
end
|
|
433
|
-
|
|
434
|
-
it 'has the correct #name' do
|
|
435
|
-
expect(exp.name).to eq 'foo::Bar'
|
|
436
|
-
end
|
|
437
|
-
|
|
438
|
-
it 'has the correct #simple_name' do
|
|
439
|
-
expect(exp.simple_name).to eq 'Bar'
|
|
440
|
-
end
|
|
441
|
-
end
|
|
442
|
-
end
|
|
443
|
-
|
|
444
|
-
RSpec.describe Reek::AST::SexpExtensions::CasgnNode do
|
|
445
|
-
describe '#defines_module?' do
|
|
446
|
-
it 'is false for single assignment' do
|
|
447
|
-
exp = sexp(:casgn, nil, :Foo)
|
|
448
|
-
expect(exp).not_to be_defines_module
|
|
449
|
-
end
|
|
450
|
-
|
|
451
|
-
it 'is false for implicit receiver to new' do
|
|
452
|
-
exp = sexp(:casgn, nil, :Foo, sexp(:send, nil, :new))
|
|
453
|
-
expect(exp).not_to be_defines_module
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
it 'is true for explicit receiver to new' do
|
|
457
|
-
exp = Reek::Source::SourceCode.from('Foo = Class.new(Bar)').syntax_tree
|
|
458
|
-
expect(exp).to be_defines_module
|
|
459
|
-
end
|
|
460
|
-
|
|
461
|
-
it 'is false for assigning a lambda to a constant' do
|
|
462
|
-
exp = Reek::Source::SourceCode.from('C = ->{}').syntax_tree
|
|
463
|
-
expect(exp).not_to be_defines_module
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
it 'is false for assigning a string to a constant' do
|
|
467
|
-
exp = Reek::Source::SourceCode.from('C = "hello"').syntax_tree
|
|
468
|
-
expect(exp).not_to be_defines_module
|
|
469
|
-
end
|
|
470
|
-
end
|
|
471
|
-
|
|
472
|
-
describe '#superclass' do
|
|
473
|
-
it 'returns the superclass from the class definition' do
|
|
474
|
-
exp = Reek::Source::SourceCode.from('Foo = Class.new(Bar)').syntax_tree
|
|
475
|
-
expect(exp.superclass).to eq sexp(:const, nil, :Bar)
|
|
476
|
-
end
|
|
477
|
-
|
|
478
|
-
it 'returns nil in case of no class definition' do
|
|
479
|
-
exp = Reek::Source::SourceCode.from('Foo = 23').syntax_tree
|
|
480
|
-
expect(exp.superclass).to be_nil
|
|
481
|
-
end
|
|
482
|
-
|
|
483
|
-
it 'returns nil in case of no superclass' do
|
|
484
|
-
exp = Reek::Source::SourceCode.from('Foo = Class.new').syntax_tree
|
|
485
|
-
expect(exp.superclass).to be_nil
|
|
486
|
-
end
|
|
487
|
-
|
|
488
|
-
it 'returns nothing for a class definition using Struct.new' do
|
|
489
|
-
exp = Reek::Source::SourceCode.from('Foo = Struct.new("Bar")').syntax_tree
|
|
490
|
-
expect(exp.superclass).to be_nil
|
|
491
|
-
end
|
|
492
|
-
|
|
493
|
-
it 'returns nothing for a constant assigned with a bare method call' do
|
|
494
|
-
exp = Reek::Source::SourceCode.from('Foo = foo("Bar")').syntax_tree
|
|
495
|
-
expect(exp.superclass).to be_nil
|
|
496
|
-
end
|
|
497
|
-
end
|
|
498
|
-
end
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/cli/application'
|
|
3
|
-
|
|
4
|
-
RSpec.describe Reek::CLI::Application do
|
|
5
|
-
describe '#initialize' do
|
|
6
|
-
it 'exits with default error code on invalid options' do
|
|
7
|
-
call = lambda do
|
|
8
|
-
Reek::CLI::Silencer.silently do
|
|
9
|
-
described_class.new ['--foo']
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
expect(&call).to raise_error(SystemExit) do |error|
|
|
13
|
-
expect(error.status).to eq Reek::CLI::Status::DEFAULT_ERROR_EXIT_CODE
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe '#execute' do
|
|
19
|
-
let(:path_excluded_in_configuration) do
|
|
20
|
-
SAMPLES_DIR.join('source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb')
|
|
21
|
-
end
|
|
22
|
-
let(:configuration) { test_configuration_for(CONFIGURATION_DIR.join('with_excluded_paths.reek')) }
|
|
23
|
-
let(:command) { instance_double 'Reek::CLI::Command::ReportCommand' }
|
|
24
|
-
let(:app) { described_class.new [] }
|
|
25
|
-
|
|
26
|
-
before do
|
|
27
|
-
allow(Reek::CLI::Command::ReportCommand).to receive(:new).and_return command
|
|
28
|
-
allow(command).to receive(:execute).and_return 'foo'
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "returns the command's result code" do
|
|
32
|
-
expect(app.execute).to eq 'foo'
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
context 'when no source files given and input was piped' do
|
|
36
|
-
before do
|
|
37
|
-
allow_any_instance_of(IO).to receive(:tty?).and_return(false)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it 'uses source from pipe' do
|
|
41
|
-
expected_sources = a_collection_containing_exactly(have_attributes(origin: 'STDIN'))
|
|
42
|
-
app.execute
|
|
43
|
-
expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
|
|
44
|
-
with(sources: expected_sources,
|
|
45
|
-
configuration: Reek::Configuration::AppConfiguration,
|
|
46
|
-
options: Reek::CLI::Options)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
context 'when a stdin filename is provided' do
|
|
50
|
-
let(:app) { described_class.new ['--stdin-filename', 'foo.rb'] }
|
|
51
|
-
|
|
52
|
-
it 'assumes that filename' do
|
|
53
|
-
expected_sources = a_collection_containing_exactly(have_attributes(origin: 'foo.rb'))
|
|
54
|
-
app.execute
|
|
55
|
-
expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
|
|
56
|
-
with(sources: expected_sources,
|
|
57
|
-
configuration: Reek::Configuration::AppConfiguration,
|
|
58
|
-
options: Reek::CLI::Options)
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
context 'when no source files given and no input was piped' do
|
|
64
|
-
before do
|
|
65
|
-
allow_any_instance_of(IO).to receive(:tty?).and_return(true)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it 'uses working directory as source' do
|
|
69
|
-
expected_sources = Reek::Source::SourceLocator.new(['.']).sources
|
|
70
|
-
app.execute
|
|
71
|
-
expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
|
|
72
|
-
with(sources: expected_sources,
|
|
73
|
-
configuration: Reek::Configuration::AppConfiguration,
|
|
74
|
-
options: Reek::CLI::Options)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
context 'when source files are excluded through configuration' do
|
|
78
|
-
let(:app) { described_class.new ['--config', 'some_file.reek'] }
|
|
79
|
-
|
|
80
|
-
before do
|
|
81
|
-
allow(Reek::Configuration::AppConfiguration).
|
|
82
|
-
to receive(:from_path).
|
|
83
|
-
with(Pathname.new('some_file.reek')).
|
|
84
|
-
and_return configuration
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
it 'uses configuration for excluded paths' do
|
|
88
|
-
expected_sources = Reek::Source::SourceLocator.
|
|
89
|
-
new(['.'], configuration: configuration).sources
|
|
90
|
-
expect(expected_sources).not_to include(path_excluded_in_configuration)
|
|
91
|
-
|
|
92
|
-
app.execute
|
|
93
|
-
|
|
94
|
-
expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
|
|
95
|
-
with(sources: expected_sources,
|
|
96
|
-
configuration: configuration,
|
|
97
|
-
options: Reek::CLI::Options)
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
context 'when source files given' do
|
|
103
|
-
let(:app) { described_class.new ['.'] }
|
|
104
|
-
|
|
105
|
-
it 'uses sources from argv' do
|
|
106
|
-
expected_sources = Reek::Source::SourceLocator.new(['.']).sources
|
|
107
|
-
app.execute
|
|
108
|
-
expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
|
|
109
|
-
with(sources: expected_sources,
|
|
110
|
-
configuration: Reek::Configuration::AppConfiguration,
|
|
111
|
-
options: Reek::CLI::Options)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
context 'when source files are excluded through configuration' do
|
|
115
|
-
let(:app) { described_class.new ['--config', 'some_file.reek', '.'] }
|
|
116
|
-
|
|
117
|
-
before do
|
|
118
|
-
allow(Reek::Configuration::AppConfiguration).
|
|
119
|
-
to receive(:from_path).
|
|
120
|
-
with(Pathname.new('some_file.reek')).
|
|
121
|
-
and_return configuration
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it 'uses configuration for excluded paths' do
|
|
125
|
-
expected_sources = Reek::Source::SourceLocator.
|
|
126
|
-
new(['.'], configuration: configuration).sources
|
|
127
|
-
expect(expected_sources).not_to include(path_excluded_in_configuration)
|
|
128
|
-
|
|
129
|
-
app.execute
|
|
130
|
-
|
|
131
|
-
expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
|
|
132
|
-
with(sources: expected_sources,
|
|
133
|
-
configuration: configuration,
|
|
134
|
-
options: Reek::CLI::Options)
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
describe 'show configuration path' do
|
|
141
|
-
let(:app) { described_class.new ['--show-configuration-path', '.'] }
|
|
142
|
-
|
|
143
|
-
around do |example|
|
|
144
|
-
Dir.mktmpdir do |tmp|
|
|
145
|
-
Dir.chdir(tmp) do
|
|
146
|
-
example.run
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
context 'when not using any configuration file' do
|
|
152
|
-
it 'prints that we are not using any configuration file' do
|
|
153
|
-
expect do
|
|
154
|
-
app.execute
|
|
155
|
-
end.to output("Not using any configuration file.\n").to_stdout
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
context 'with a default configuration file' do
|
|
160
|
-
it 'prints that we are using the default configuration file' do
|
|
161
|
-
FileUtils.touch '.reek.yml'
|
|
162
|
-
expect do
|
|
163
|
-
app.execute
|
|
164
|
-
end.to output("Using '.reek.yml' as configuration file.\n").to_stdout
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
require_relative '../../../spec_helper'
|
|
2
|
-
require_lib 'reek/cli/command/report_command'
|
|
3
|
-
require_lib 'reek/cli/options'
|
|
4
|
-
|
|
5
|
-
RSpec.describe Reek::CLI::Command::ReportCommand do
|
|
6
|
-
describe '#execute' do
|
|
7
|
-
let(:options) { Reek::CLI::Options.new [] }
|
|
8
|
-
|
|
9
|
-
let(:configuration) { instance_double 'Reek::Configuration::AppConfiguration' }
|
|
10
|
-
let(:sources) { [source_file] }
|
|
11
|
-
|
|
12
|
-
let(:command) do
|
|
13
|
-
described_class.new(options: options,
|
|
14
|
-
sources: sources,
|
|
15
|
-
configuration: configuration)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
before do
|
|
19
|
-
allow(configuration).to receive(:directive_for).and_return({})
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
context 'when no smells are found' do
|
|
23
|
-
let(:source_file) { CLEAN_FILE }
|
|
24
|
-
|
|
25
|
-
it 'returns a success code' do
|
|
26
|
-
result = Reek::CLI::Silencer.silently do
|
|
27
|
-
command.execute
|
|
28
|
-
end
|
|
29
|
-
expect(result).to eq Reek::CLI::Status::DEFAULT_SUCCESS_EXIT_CODE
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
context 'when smells are found' do
|
|
34
|
-
let(:source_file) { SMELLY_FILE }
|
|
35
|
-
|
|
36
|
-
it 'returns a failure code' do
|
|
37
|
-
result = Reek::CLI::Silencer.silently do
|
|
38
|
-
command.execute
|
|
39
|
-
end
|
|
40
|
-
expect(result).to eq Reek::CLI::Status::DEFAULT_FAILURE_EXIT_CODE
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|