reek 4.7.3 → 5.0.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/.codeclimate.yml +17 -12
- data/.rubocop.yml +18 -3
- data/.simplecov +1 -0
- data/.travis.yml +3 -4
- data/.yardopts +1 -1
- data/CHANGELOG.md +45 -0
- data/Gemfile +4 -4
- data/README.md +134 -104
- data/Rakefile +16 -3
- data/bin/reek +1 -3
- data/docs/API.md +2 -9
- data/docs/Basic-Smell-Options.md +51 -11
- data/docs/Code-Smells.md +1 -1
- data/docs/Command-Line-Options.md +14 -4
- data/docs/Duplicate-Method-Call.md +49 -1
- data/docs/Feature-Envy.md +44 -0
- data/docs/How-To-Write-New-Detectors.md +2 -3
- data/docs/Instance-Variable-Assumption.md +1 -1
- data/docs/{Prima-Donna-Method.md → Missing-Safe-Method.md} +11 -9
- data/docs/Rake-Task.md +1 -1
- data/docs/Reek-4-to-Reek-5-migration.md +193 -0
- data/docs/Reek-Driven-Development.md +1 -1
- data/docs/Uncommunicative-Method-Name.md +45 -6
- data/docs/Uncommunicative-Module-Name.md +49 -7
- data/docs/Uncommunicative-Parameter-Name.md +43 -5
- data/docs/Uncommunicative-Variable-Name.md +73 -2
- data/docs/Unused-Private-Method.md +2 -2
- data/docs/defaults.reek.yml +129 -0
- data/docs/yard_plugin.rb +1 -0
- data/features/command_line_interface/basic_usage.feature +2 -2
- data/features/command_line_interface/options.feature +46 -4
- data/features/command_line_interface/show_progress.feature +4 -4
- data/features/command_line_interface/smell_selection.feature +1 -1
- data/features/command_line_interface/smells_count.feature +6 -6
- data/features/command_line_interface/stdin.feature +30 -8
- data/features/configuration_files/accept_setting.feature +45 -28
- data/features/configuration_files/directory_specific_directives.feature +78 -73
- data/features/configuration_files/exclude_directives.feature +11 -10
- data/features/configuration_files/exclude_paths_directives.feature +4 -4
- data/features/configuration_files/masking_smells.feature +38 -9
- data/features/configuration_files/mix_accept_reject_setting.feature +31 -28
- data/features/configuration_files/reject_setting.feature +52 -41
- data/features/configuration_files/schema_validation.feature +59 -0
- data/features/configuration_files/unused_private_method.feature +18 -16
- data/features/configuration_loading.feature +53 -10
- data/features/configuration_via_source_comments/erroneous_source_comments.feature +2 -2
- data/features/configuration_via_source_comments/well_formed_source_comments.feature +2 -2
- data/features/locales.feature +2 -2
- data/features/rake_task/rake_task.feature +15 -15
- data/features/reports/json.feature +3 -3
- data/features/reports/reports.feature +34 -34
- data/features/reports/yaml.feature +3 -3
- data/features/rspec_matcher.feature +9 -1
- data/features/samples.feature +287 -287
- data/features/step_definitions/reek_steps.rb +4 -0
- data/features/step_definitions/sample_file_steps.rb +9 -4
- data/features/support/env.rb +2 -2
- data/features/todo_list.feature +26 -23
- data/lib/reek/ast/node.rb +40 -55
- data/lib/reek/ast/object_refs.rb +1 -1
- data/lib/reek/ast/reference_collector.rb +2 -4
- data/lib/reek/ast/sexp_extensions/case.rb +1 -1
- data/lib/reek/ast/sexp_extensions/if.rb +8 -1
- data/lib/reek/ast/sexp_extensions/logical_operators.rb +1 -1
- data/lib/reek/ast/sexp_extensions/methods.rb +4 -6
- data/lib/reek/cli/application.rb +4 -3
- data/lib/reek/cli/command/report_command.rb +1 -2
- data/lib/reek/cli/command/todo_list_command.rb +8 -8
- data/lib/reek/cli/options.rb +29 -14
- data/lib/reek/cli/silencer.rb +14 -3
- data/lib/reek/code_comment.rb +14 -16
- data/lib/reek/configuration/app_configuration.rb +32 -28
- data/lib/reek/configuration/configuration_converter.rb +110 -0
- data/lib/reek/configuration/configuration_file_finder.rb +15 -40
- data/lib/reek/configuration/configuration_validator.rb +12 -23
- data/lib/reek/configuration/default_directive.rb +17 -3
- data/lib/reek/configuration/directory_directives.rb +17 -11
- data/lib/reek/configuration/excluded_paths.rb +1 -1
- data/lib/reek/configuration/rake_task_converter.rb +29 -0
- data/lib/reek/configuration/schema.yml +210 -0
- data/lib/reek/configuration/schema_validator.rb +38 -0
- data/lib/reek/context/attribute_context.rb +1 -1
- data/lib/reek/context/code_context.rb +8 -11
- data/lib/reek/context/method_context.rb +7 -12
- data/lib/reek/context/module_context.rb +4 -4
- data/lib/reek/context_builder.rb +11 -11
- data/lib/reek/detector_repository.rb +6 -0
- data/lib/reek/documentation_link.rb +28 -0
- data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +13 -12
- data/lib/reek/errors/bad_detector_in_comment_error.rb +11 -10
- data/lib/reek/errors/base_error.rb +3 -0
- data/lib/reek/errors/config_file_error.rb +11 -0
- data/lib/reek/errors/encoding_error.rb +16 -11
- data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +11 -10
- data/lib/reek/errors/incomprehensible_source_error.rb +20 -22
- data/lib/reek/errors/syntax_error.rb +41 -0
- data/lib/reek/examiner.rb +19 -25
- data/lib/reek/logging_error_handler.rb +7 -5
- data/lib/reek/rake/task.rb +3 -3
- data/lib/reek/report/base_report.rb +8 -12
- data/lib/reek/report/code_climate/code_climate_configuration.rb +1 -1
- data/lib/reek/report/code_climate/code_climate_configuration.yml +6 -10
- data/lib/reek/report/documentation_link_warning_formatter.rb +17 -0
- data/lib/reek/report/heading_formatter.rb +54 -0
- data/lib/reek/report/json_report.rb +1 -1
- data/lib/reek/report/location_formatter.rb +40 -0
- data/lib/reek/report/progress_formatter.rb +79 -0
- data/lib/reek/report/simple_warning_formatter.rb +34 -0
- data/lib/reek/report/text_report.rb +1 -2
- data/lib/reek/report/xml_report.rb +3 -3
- data/lib/reek/report/yaml_report.rb +1 -1
- data/lib/reek/report.rb +15 -10
- data/lib/reek/smell_configuration.rb +2 -2
- data/lib/reek/smell_detectors/attribute.rb +0 -1
- data/lib/reek/smell_detectors/base_detector.rb +9 -12
- data/lib/reek/smell_detectors/boolean_parameter.rb +0 -1
- data/lib/reek/smell_detectors/class_variable.rb +3 -11
- data/lib/reek/smell_detectors/control_parameter.rb +17 -32
- data/lib/reek/smell_detectors/data_clump.rb +3 -4
- data/lib/reek/smell_detectors/duplicate_method_call.rb +6 -7
- data/lib/reek/smell_detectors/feature_envy.rb +1 -1
- data/lib/reek/smell_detectors/instance_variable_assumption.rb +1 -10
- data/lib/reek/smell_detectors/irresponsible_module.rb +0 -1
- data/lib/reek/smell_detectors/long_parameter_list.rb +1 -2
- data/lib/reek/smell_detectors/long_yield_list.rb +2 -3
- data/lib/reek/smell_detectors/manual_dispatch.rb +3 -3
- data/lib/reek/smell_detectors/{prima_donna_method.rb → missing_safe_method.rb} +6 -7
- data/lib/reek/smell_detectors/module_initialize.rb +1 -2
- data/lib/reek/smell_detectors/nested_iterators.rb +6 -6
- data/lib/reek/smell_detectors/nil_check.rb +0 -1
- data/lib/reek/smell_detectors/repeated_conditional.rb +3 -4
- data/lib/reek/smell_detectors/subclassed_from_core_class.rb +0 -1
- data/lib/reek/smell_detectors/too_many_constants.rb +2 -3
- data/lib/reek/smell_detectors/too_many_instance_variables.rb +1 -2
- data/lib/reek/smell_detectors/too_many_methods.rb +1 -2
- data/lib/reek/smell_detectors/too_many_statements.rb +1 -2
- data/lib/reek/smell_detectors/uncommunicative_method_name.rb +2 -3
- data/lib/reek/smell_detectors/uncommunicative_module_name.rb +2 -3
- data/lib/reek/smell_detectors/uncommunicative_parameter_name.rb +2 -3
- data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +6 -7
- data/lib/reek/smell_detectors/unused_parameters.rb +0 -1
- data/lib/reek/smell_detectors/unused_private_method.rb +0 -1
- data/lib/reek/smell_detectors/utility_function.rb +2 -3
- data/lib/reek/smell_detectors.rb +1 -2
- data/lib/reek/smell_warning.rb +15 -8
- data/lib/reek/source/source_code.rb +50 -72
- data/lib/reek/source/source_locator.rb +7 -7
- data/lib/reek/spec/should_reek.rb +2 -2
- data/lib/reek/spec/should_reek_of.rb +9 -16
- data/lib/reek/spec/should_reek_only_of.rb +4 -4
- data/lib/reek/spec.rb +6 -6
- data/lib/reek/tree_dresser.rb +5 -5
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +5 -5
- data/samples/checkstyle.xml +1 -1
- data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +29 -0
- data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +30 -0
- data/samples/configuration/full_configuration.reek +8 -4
- data/samples/configuration/full_mask.reek +5 -4
- data/samples/configuration/partial_mask.reek +3 -2
- data/samples/configuration/regular_configuration/.reek.yml +4 -0
- data/samples/paths.rb +5 -4
- data/samples/source_with_hidden_directories/.hidden/hidden.rb +1 -0
- data/samples/source_with_hidden_directories/not_hidden.rb +1 -0
- data/spec/factories/factories.rb +2 -13
- data/spec/reek/ast/node_spec.rb +103 -10
- data/spec/reek/ast/reference_collector_spec.rb +1 -1
- data/spec/reek/ast/sexp_extensions_spec.rb +2 -2
- data/spec/reek/cli/application_spec.rb +50 -38
- data/spec/reek/cli/command/todo_list_command_spec.rb +6 -4
- data/spec/reek/cli/silencer_spec.rb +28 -0
- data/spec/reek/code_comment_spec.rb +31 -38
- data/spec/reek/configuration/app_configuration_spec.rb +46 -33
- data/spec/reek/configuration/configuration_file_finder_spec.rb +133 -49
- data/spec/reek/configuration/default_directive_spec.rb +1 -1
- data/spec/reek/configuration/directory_directives_spec.rb +6 -7
- data/spec/reek/configuration/excluded_paths_spec.rb +6 -6
- data/spec/reek/configuration/rake_task_converter_spec.rb +33 -0
- data/spec/reek/configuration/schema_validator_spec.rb +165 -0
- data/spec/reek/context/code_context_spec.rb +60 -96
- data/spec/reek/context/ghost_context_spec.rb +1 -1
- data/spec/reek/context/root_context_spec.rb +1 -1
- data/spec/reek/documentation_link_spec.rb +20 -0
- data/spec/reek/errors/base_error_spec.rb +13 -0
- data/spec/reek/examiner_spec.rb +100 -30
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +82 -80
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +6 -6
- data/spec/reek/report/json_report_spec.rb +13 -46
- data/spec/reek/report/{formatter/location_formatter_spec.rb → location_formatter_spec.rb} +5 -5
- data/spec/reek/report/{formatter/progress_formatter_spec.rb → progress_formatter_spec.rb} +4 -4
- data/spec/reek/report/text_report_spec.rb +4 -4
- data/spec/reek/report/xml_report_spec.rb +3 -3
- data/spec/reek/report/yaml_report_spec.rb +9 -38
- data/spec/reek/report_spec.rb +3 -3
- data/spec/reek/smell_detectors/boolean_parameter_spec.rb +2 -2
- data/spec/reek/smell_detectors/class_variable_spec.rb +26 -32
- data/spec/reek/smell_detectors/control_parameter_spec.rb +34 -4
- data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +3 -3
- data/spec/reek/smell_detectors/feature_envy_spec.rb +47 -2
- data/spec/reek/smell_detectors/{prima_donna_method_spec.rb → missing_safe_method_spec.rb} +9 -9
- data/spec/reek/smell_detectors/module_initialize_spec.rb +14 -0
- data/spec/reek/smell_detectors/nested_iterators_spec.rb +1 -1
- data/spec/reek/smell_detectors/too_many_constants_spec.rb +3 -3
- data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +1 -1
- data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +6 -6
- data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +6 -4
- data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +6 -4
- data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +9 -9
- data/spec/reek/smell_detectors/unused_parameters_spec.rb +3 -3
- data/spec/reek/smell_detectors/unused_private_method_spec.rb +10 -10
- data/spec/reek/smell_detectors/utility_function_spec.rb +5 -5
- data/spec/reek/smell_warning_spec.rb +12 -8
- data/spec/reek/source/source_code_spec.rb +17 -43
- data/spec/reek/source/source_locator_spec.rb +17 -17
- data/spec/reek/spec/should_reek_of_spec.rb +7 -11
- data/spec/reek/spec/should_reek_only_of_spec.rb +2 -2
- data/spec/reek/spec/should_reek_spec.rb +3 -3
- data/spec/reek/spec/smell_matcher_spec.rb +3 -3
- data/spec/reek/tree_dresser_spec.rb +12 -17
- data/spec/spec_helper.rb +6 -17
- data/tasks/configuration.rake +8 -5
- metadata +71 -41
- data/defaults.reek +0 -131
- data/features/configuration_files/warn_about_multiple_configuration_files.feature +0 -44
- data/lib/reek/report/formatter/heading_formatter.rb +0 -52
- data/lib/reek/report/formatter/location_formatter.rb +0 -42
- data/lib/reek/report/formatter/progress_formatter.rb +0 -81
- data/lib/reek/report/formatter/simple_warning_formatter.rb +0 -35
- data/lib/reek/report/formatter/wiki_link_warning_formatter.rb +0 -36
- data/lib/reek/report/formatter.rb +0 -33
- data/lib/reek/smell_detectors/syntax.rb +0 -37
- data/samples/configuration/non_public_modifiers_mask.reek +0 -3
- data/samples/smelly_with_inline_mask.rb +0 -8
- data/samples/smelly_with_modifiers.rb +0 -12
- data/samples/source_with_hidden_directories/.hidden/uncommunicative_method_name.rb +0 -5
- data/samples/source_with_non_ruby_files/uncommunicative_parameter_name.rb +0 -6
- data/spec/reek/smell_detectors/syntax_spec.rb +0 -17
- /data/{samples/configuration/more_than_one_configuration_file/regular.reek → .reek.yml} +0 -0
- /data/samples/{clean.rb → clean_source/clean.rb} +0 -0
- /data/samples/{exceptions.reek → configuration/home/home.reek.yml} +0 -0
- /data/samples/configuration/{more_than_one_configuration_file/todo.reek → regular_configuration/empty_sub_directory/.gitignore} +0 -0
- /data/samples/{configuration/single_configuration_file/.reek → no_config_file/.keep} +0 -0
- /data/samples/{inline.rb → smelly_source/inline.rb} +0 -0
- /data/samples/{optparse.rb → smelly_source/optparse.rb} +0 -0
- /data/samples/{redcloth.rb → smelly_source/redcloth.rb} +0 -0
- /data/samples/{smelly.rb → smelly_source/smelly.rb} +0 -0
- /data/samples/{source_with_hidden_directories/uncommunicative_parameter_name.rb → source_with_non_ruby_files/ruby.rb} +0 -0
data/defaults.reek
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
Attribute:
|
|
3
|
-
enabled: true
|
|
4
|
-
exclude: []
|
|
5
|
-
BooleanParameter:
|
|
6
|
-
enabled: true
|
|
7
|
-
exclude: []
|
|
8
|
-
ClassVariable:
|
|
9
|
-
enabled: true
|
|
10
|
-
exclude: []
|
|
11
|
-
ControlParameter:
|
|
12
|
-
enabled: true
|
|
13
|
-
exclude: []
|
|
14
|
-
DataClump:
|
|
15
|
-
enabled: true
|
|
16
|
-
exclude: []
|
|
17
|
-
max_copies: 2
|
|
18
|
-
min_clump_size: 2
|
|
19
|
-
DuplicateMethodCall:
|
|
20
|
-
enabled: true
|
|
21
|
-
exclude: []
|
|
22
|
-
max_calls: 1
|
|
23
|
-
allow_calls: []
|
|
24
|
-
FeatureEnvy:
|
|
25
|
-
enabled: true
|
|
26
|
-
exclude: []
|
|
27
|
-
InstanceVariableAssumption:
|
|
28
|
-
enabled: true
|
|
29
|
-
exclude: []
|
|
30
|
-
IrresponsibleModule:
|
|
31
|
-
enabled: true
|
|
32
|
-
exclude: []
|
|
33
|
-
LongParameterList:
|
|
34
|
-
enabled: true
|
|
35
|
-
exclude: []
|
|
36
|
-
max_params: 3
|
|
37
|
-
overrides:
|
|
38
|
-
initialize:
|
|
39
|
-
max_params: 5
|
|
40
|
-
LongYieldList:
|
|
41
|
-
enabled: true
|
|
42
|
-
exclude: []
|
|
43
|
-
max_params: 3
|
|
44
|
-
ManualDispatch:
|
|
45
|
-
enabled: true
|
|
46
|
-
exclude: []
|
|
47
|
-
ModuleInitialize:
|
|
48
|
-
enabled: true
|
|
49
|
-
exclude: []
|
|
50
|
-
NestedIterators:
|
|
51
|
-
enabled: true
|
|
52
|
-
exclude: []
|
|
53
|
-
max_allowed_nesting: 1
|
|
54
|
-
ignore_iterators:
|
|
55
|
-
- tap
|
|
56
|
-
NilCheck:
|
|
57
|
-
enabled: true
|
|
58
|
-
exclude: []
|
|
59
|
-
PrimaDonnaMethod:
|
|
60
|
-
enabled: true
|
|
61
|
-
exclude: []
|
|
62
|
-
RepeatedConditional:
|
|
63
|
-
enabled: true
|
|
64
|
-
exclude: []
|
|
65
|
-
max_ifs: 2
|
|
66
|
-
SubclassedFromCoreClass:
|
|
67
|
-
enabled: true
|
|
68
|
-
exclude: []
|
|
69
|
-
Syntax:
|
|
70
|
-
enabled: true
|
|
71
|
-
exclude: []
|
|
72
|
-
TooManyConstants:
|
|
73
|
-
enabled: true
|
|
74
|
-
exclude: []
|
|
75
|
-
max_constants: 5
|
|
76
|
-
TooManyInstanceVariables:
|
|
77
|
-
enabled: true
|
|
78
|
-
exclude: []
|
|
79
|
-
max_instance_variables: 4
|
|
80
|
-
TooManyMethods:
|
|
81
|
-
enabled: true
|
|
82
|
-
exclude: []
|
|
83
|
-
max_methods: 15
|
|
84
|
-
TooManyStatements:
|
|
85
|
-
enabled: true
|
|
86
|
-
exclude:
|
|
87
|
-
- initialize
|
|
88
|
-
max_statements: 5
|
|
89
|
-
UncommunicativeMethodName:
|
|
90
|
-
enabled: true
|
|
91
|
-
exclude: []
|
|
92
|
-
reject:
|
|
93
|
-
- !ruby/regexp /^[a-z]$/
|
|
94
|
-
- !ruby/regexp /[0-9]$/
|
|
95
|
-
- !ruby/regexp /[A-Z]/
|
|
96
|
-
accept: []
|
|
97
|
-
UncommunicativeModuleName:
|
|
98
|
-
enabled: true
|
|
99
|
-
exclude: []
|
|
100
|
-
reject:
|
|
101
|
-
- !ruby/regexp /^.$/
|
|
102
|
-
- !ruby/regexp /[0-9]$/
|
|
103
|
-
accept: []
|
|
104
|
-
UncommunicativeParameterName:
|
|
105
|
-
enabled: true
|
|
106
|
-
exclude: []
|
|
107
|
-
reject:
|
|
108
|
-
- !ruby/regexp /^.$/
|
|
109
|
-
- !ruby/regexp /[0-9]$/
|
|
110
|
-
- !ruby/regexp /[A-Z]/
|
|
111
|
-
- !ruby/regexp /^_/
|
|
112
|
-
accept: []
|
|
113
|
-
UncommunicativeVariableName:
|
|
114
|
-
enabled: true
|
|
115
|
-
exclude: []
|
|
116
|
-
reject:
|
|
117
|
-
- !ruby/regexp /^.$/
|
|
118
|
-
- !ruby/regexp /[0-9]$/
|
|
119
|
-
- !ruby/regexp /[A-Z]/
|
|
120
|
-
accept:
|
|
121
|
-
- !ruby/regexp /^_$/
|
|
122
|
-
UnusedParameters:
|
|
123
|
-
enabled: true
|
|
124
|
-
exclude: []
|
|
125
|
-
UnusedPrivateMethod:
|
|
126
|
-
enabled: false
|
|
127
|
-
exclude: []
|
|
128
|
-
UtilityFunction:
|
|
129
|
-
enabled: true
|
|
130
|
-
exclude: []
|
|
131
|
-
public_methods_only: false
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
Feature: Warn on multiple configuration files
|
|
2
|
-
Reek is designed for one configuration file and for one configuration file only.
|
|
3
|
-
We should make this clear to the user by warning him when we detect multiple
|
|
4
|
-
configuration files and then exiting the program.
|
|
5
|
-
|
|
6
|
-
Scenario: Warn on more than one configuration file
|
|
7
|
-
Given the smelly file 'smelly.rb'
|
|
8
|
-
And a file named "config.reek" with:
|
|
9
|
-
"""
|
|
10
|
-
---
|
|
11
|
-
UncommunicativeMethodName:
|
|
12
|
-
enabled: false
|
|
13
|
-
"""
|
|
14
|
-
And a file named ".todo.reek" with:
|
|
15
|
-
"""
|
|
16
|
-
---
|
|
17
|
-
UtilityFunction:
|
|
18
|
-
enabled: false
|
|
19
|
-
"""
|
|
20
|
-
When I run reek smelly.rb
|
|
21
|
-
Then it reports the error "Error: Found multiple configuration files '.todo.reek', 'config.reek'"
|
|
22
|
-
And it reports the error "Reek supports only one configuration file. You have 2 options now:"
|
|
23
|
-
And it reports the error "1) Remove all offending files"
|
|
24
|
-
And it reports the error "2) Be specific about which one you want to load via the -c switch"
|
|
25
|
-
And the exit status indicates an error
|
|
26
|
-
|
|
27
|
-
Scenario: Do not warn on more than one when we explicitly specify one configuration file
|
|
28
|
-
Given the smelly file 'smelly.rb'
|
|
29
|
-
And a file named "config.reek" with:
|
|
30
|
-
"""
|
|
31
|
-
---
|
|
32
|
-
UncommunicativeMethodName:
|
|
33
|
-
enabled: false
|
|
34
|
-
"""
|
|
35
|
-
And a file named ".todo.reek" with:
|
|
36
|
-
"""
|
|
37
|
-
---
|
|
38
|
-
UtilityFunction:
|
|
39
|
-
enabled: false
|
|
40
|
-
"""
|
|
41
|
-
When I run reek -c config.reek smelly.rb
|
|
42
|
-
Then the exit status indicates smells
|
|
43
|
-
And it reports no errors
|
|
44
|
-
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Reek
|
|
4
|
-
module Report
|
|
5
|
-
module Formatter
|
|
6
|
-
#
|
|
7
|
-
# Base class for heading formatters.
|
|
8
|
-
# Is responsible for formatting the heading emitted for each examiner
|
|
9
|
-
#
|
|
10
|
-
# @abstract Override {#show_header?} to implement a heading formatter.
|
|
11
|
-
class HeadingFormatterBase
|
|
12
|
-
attr_reader :report_formatter
|
|
13
|
-
|
|
14
|
-
def initialize(report_formatter)
|
|
15
|
-
@report_formatter = report_formatter
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# :reek:UtilityFunction
|
|
19
|
-
def show_header?(_examiner)
|
|
20
|
-
raise NotImplementedError
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def header(examiner)
|
|
24
|
-
if show_header?(examiner)
|
|
25
|
-
report_formatter.header examiner
|
|
26
|
-
else
|
|
27
|
-
''
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
#
|
|
33
|
-
# Lists out each examiner, even if it has no smell
|
|
34
|
-
#
|
|
35
|
-
class VerboseHeadingFormatter < HeadingFormatterBase
|
|
36
|
-
def show_header?(_examiner)
|
|
37
|
-
true
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
#
|
|
42
|
-
# Lists only smelly examiners
|
|
43
|
-
#
|
|
44
|
-
class QuietHeadingFormatter < HeadingFormatterBase
|
|
45
|
-
# :reek:UtilityFunction
|
|
46
|
-
def show_header?(examiner)
|
|
47
|
-
examiner.smelly?
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Reek
|
|
4
|
-
module Report
|
|
5
|
-
module Formatter
|
|
6
|
-
#
|
|
7
|
-
# Formats the location of a warning as an empty string.
|
|
8
|
-
#
|
|
9
|
-
module BlankLocationFormatter
|
|
10
|
-
module_function
|
|
11
|
-
|
|
12
|
-
def format(_warning)
|
|
13
|
-
''
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
# Formats the location of a warning as an array of line numbers.
|
|
19
|
-
#
|
|
20
|
-
module DefaultLocationFormatter
|
|
21
|
-
module_function
|
|
22
|
-
|
|
23
|
-
def format(warning)
|
|
24
|
-
"#{warning.lines.sort.inspect}:"
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
#
|
|
29
|
-
# Formats the location of a warning as a combination of source file name
|
|
30
|
-
# and line number. In this format, it is not possible to show more than
|
|
31
|
-
# one line number, so the first number is displayed.
|
|
32
|
-
#
|
|
33
|
-
module SingleLineLocationFormatter
|
|
34
|
-
module_function
|
|
35
|
-
|
|
36
|
-
def format(warning)
|
|
37
|
-
"#{warning.source}:#{warning.lines.sort.first}: "
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Reek
|
|
4
|
-
module Report
|
|
5
|
-
module Formatter
|
|
6
|
-
module ProgressFormatter
|
|
7
|
-
#
|
|
8
|
-
# Base class for progress formatters.
|
|
9
|
-
# Is responsible for formatting the progress emitted for each examiner
|
|
10
|
-
#
|
|
11
|
-
# @abstract Override {#header, #progress, #footer} to implement a progress formatter.
|
|
12
|
-
class Base
|
|
13
|
-
attr_reader :sources_count
|
|
14
|
-
|
|
15
|
-
def initialize(sources_count)
|
|
16
|
-
@sources_count = sources_count
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def header
|
|
20
|
-
raise NotImplementedError
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def progress(_examiner)
|
|
24
|
-
raise NotImplementedError
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def footer
|
|
28
|
-
raise NotImplementedError
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
#
|
|
33
|
-
# Shows the status of each source as either a dot (.) or an S
|
|
34
|
-
#
|
|
35
|
-
class Dots < Base
|
|
36
|
-
NO_WARNINGS_COLOR = :green
|
|
37
|
-
WARNINGS_COLOR = :red
|
|
38
|
-
|
|
39
|
-
def header
|
|
40
|
-
"Inspecting #{sources_count} file(s):\n"
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def progress(examiner)
|
|
44
|
-
examiner.smelly? ? display_smelly : display_clean
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def footer
|
|
48
|
-
"\n\n"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
private
|
|
52
|
-
|
|
53
|
-
def display_clean
|
|
54
|
-
Rainbow('.').color(NO_WARNINGS_COLOR)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def display_smelly
|
|
58
|
-
Rainbow('S').color(WARNINGS_COLOR)
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
#
|
|
63
|
-
# Does not show progress
|
|
64
|
-
#
|
|
65
|
-
class Quiet < Base
|
|
66
|
-
def header
|
|
67
|
-
''
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def progress(_examiner)
|
|
71
|
-
''
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def footer
|
|
75
|
-
''
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Reek
|
|
4
|
-
module Report
|
|
5
|
-
module Formatter
|
|
6
|
-
#
|
|
7
|
-
# Basic formatter that just shows a simple message for each warning,
|
|
8
|
-
# prepended with the result of the passed-in location formatter.
|
|
9
|
-
#
|
|
10
|
-
class SimpleWarningFormatter
|
|
11
|
-
def initialize(location_formatter: BlankLocationFormatter)
|
|
12
|
-
@location_formatter = location_formatter
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def format(warning)
|
|
16
|
-
"#{location_formatter.format(warning)}#{warning.base_message}"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# :reek:UtilityFunction
|
|
20
|
-
def format_hash(warning)
|
|
21
|
-
warning.yaml_hash
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# :reek:UtilityFunction
|
|
25
|
-
def format_code_climate_hash(warning)
|
|
26
|
-
CodeClimateFormatter.new(warning).render
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
attr_reader :location_formatter
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative 'simple_warning_formatter'
|
|
4
|
-
|
|
5
|
-
module Reek
|
|
6
|
-
module Report
|
|
7
|
-
module Formatter
|
|
8
|
-
#
|
|
9
|
-
# Formatter that adds a link to the wiki to the basic message from
|
|
10
|
-
# SimpleWarningFormatter.
|
|
11
|
-
#
|
|
12
|
-
class WikiLinkWarningFormatter < SimpleWarningFormatter
|
|
13
|
-
BASE_URL_FOR_HELP_LINK = 'https://github.com/troessner/reek/blob/master/docs/'.freeze
|
|
14
|
-
|
|
15
|
-
def format(warning)
|
|
16
|
-
"#{super} [#{explanatory_link(warning)}]"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def format_hash(warning)
|
|
20
|
-
super.merge('wiki_link' => explanatory_link(warning))
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
private
|
|
24
|
-
|
|
25
|
-
def explanatory_link(warning)
|
|
26
|
-
"#{BASE_URL_FOR_HELP_LINK}#{class_name_to_param(warning.smell_type)}.md"
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# :reek:UtilityFunction
|
|
30
|
-
def class_name_to_param(name)
|
|
31
|
-
name.split(/(?=[A-Z])/).join('-')
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative 'code_climate/code_climate_formatter'
|
|
4
|
-
require_relative 'formatter/heading_formatter'
|
|
5
|
-
require_relative 'formatter/location_formatter'
|
|
6
|
-
require_relative 'formatter/progress_formatter'
|
|
7
|
-
require_relative 'formatter/simple_warning_formatter'
|
|
8
|
-
require_relative 'formatter/wiki_link_warning_formatter'
|
|
9
|
-
|
|
10
|
-
module Reek
|
|
11
|
-
module Report
|
|
12
|
-
#
|
|
13
|
-
# Formatter handling the formatting of the report at large.
|
|
14
|
-
# Formatting of the individual warnings is handled by the
|
|
15
|
-
# passed-in warning formatter.
|
|
16
|
-
#
|
|
17
|
-
module Formatter
|
|
18
|
-
module_function
|
|
19
|
-
|
|
20
|
-
def format_list(warnings, formatter: SimpleWarningFormatter.new)
|
|
21
|
-
warnings.map { |warning| " #{formatter.format(warning)}" }.join("\n")
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def header(examiner)
|
|
25
|
-
count = examiner.smells_count
|
|
26
|
-
result = Rainbow("#{examiner.description} -- ").cyan +
|
|
27
|
-
Rainbow("#{count} warning").yellow
|
|
28
|
-
result += Rainbow('s').yellow unless count == 1
|
|
29
|
-
result
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative 'base_detector'
|
|
4
|
-
|
|
5
|
-
module Reek
|
|
6
|
-
module SmellDetectors
|
|
7
|
-
# Check syntax errors.
|
|
8
|
-
# Note: this detector is called by examiner directly unlike other detectors.
|
|
9
|
-
class Syntax < BaseDetector
|
|
10
|
-
# Context duck type for this atypical smell detector
|
|
11
|
-
DummyContext = Struct.new(:exp, :full_name)
|
|
12
|
-
# Exp duck type for this atypical smell detector
|
|
13
|
-
DummyExp = Struct.new(:source)
|
|
14
|
-
|
|
15
|
-
def self.contexts
|
|
16
|
-
[]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def self.smells_from_source(source)
|
|
20
|
-
new.smells_from_source(source)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# :reek:FeatureEnvy
|
|
24
|
-
def smells_from_source(source)
|
|
25
|
-
context = DummyContext.new(
|
|
26
|
-
DummyExp.new(source.origin),
|
|
27
|
-
'This file')
|
|
28
|
-
source.diagnostics.map do |diagnostic|
|
|
29
|
-
smell_warning(
|
|
30
|
-
context: context,
|
|
31
|
-
lines: [diagnostic.location.line],
|
|
32
|
-
message: "has #{diagnostic.message}")
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Smelly class for testing purposes
|
|
2
|
-
#
|
|
3
|
-
# Not necessary for the feature per se but for
|
|
4
|
-
# removing distracting output. :reek:UnusedPrivateMethod
|
|
5
|
-
#
|
|
6
|
-
class Klass
|
|
7
|
-
def public_method(arg) arg.to_s; end
|
|
8
|
-
protected
|
|
9
|
-
def protected_method(arg) arg.to_s; end
|
|
10
|
-
private
|
|
11
|
-
def private_method(arg) arg.to_s; end
|
|
12
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/smell_detectors/syntax'
|
|
3
|
-
|
|
4
|
-
RSpec.describe Reek::SmellDetectors::Syntax do
|
|
5
|
-
it 'reports the right values' do
|
|
6
|
-
src = <<-EOS
|
|
7
|
-
class Alfa
|
|
8
|
-
edn
|
|
9
|
-
EOS
|
|
10
|
-
|
|
11
|
-
expect(src).to reek_of(:Syntax,
|
|
12
|
-
lines: [3],
|
|
13
|
-
context: 'This file',
|
|
14
|
-
message: 'has unexpected token $end',
|
|
15
|
-
source: 'string')
|
|
16
|
-
end
|
|
17
|
-
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|