reek 4.6.0 → 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 +79 -26
- data/.simplecov +1 -0
- data/.travis.yml +3 -9
- data/.yardopts +1 -1
- data/CHANGELOG.md +76 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +5 -5
- data/README.md +138 -107
- data/Rakefile +16 -3
- data/bin/code_climate_reek +1 -0
- data/bin/reek +2 -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 +7 -7
- 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 +3 -3
- 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 +31 -5
- data/features/configuration_files/accept_setting.feature +45 -28
- data/features/configuration_files/directory_specific_directives.feature +80 -75
- 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 +3 -3
- data/features/configuration_via_source_comments/well_formed_source_comments.feature +2 -2
- data/features/locales.feature +32 -0
- data/features/rake_task/rake_task.feature +58 -18
- data/features/reports/codeclimate.feature +59 -0
- 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 +40 -0
- data/features/samples.feature +287 -287
- data/features/step_definitions/reek_steps.rb +14 -2
- data/features/step_definitions/sample_file_steps.rb +9 -4
- data/features/support/env.rb +2 -11
- data/features/todo_list.feature +26 -23
- data/lib/reek/ast/ast_node_class_map.rb +1 -0
- data/lib/reek/ast/builder.rb +16 -0
- data/lib/reek/ast/node.rb +50 -58
- data/lib/reek/ast/object_refs.rb +2 -1
- data/lib/reek/ast/reference_collector.rb +3 -4
- data/lib/reek/ast/sexp_extensions/arguments.rb +1 -0
- data/lib/reek/ast/sexp_extensions/attribute_assignments.rb +1 -0
- data/lib/reek/ast/sexp_extensions/begin.rb +17 -0
- data/lib/reek/ast/sexp_extensions/block.rb +1 -0
- data/lib/reek/ast/sexp_extensions/case.rb +2 -1
- data/lib/reek/ast/sexp_extensions/constant.rb +1 -0
- data/lib/reek/ast/sexp_extensions/if.rb +9 -1
- data/lib/reek/ast/sexp_extensions/lambda.rb +1 -0
- data/lib/reek/ast/sexp_extensions/literal.rb +1 -0
- data/lib/reek/ast/sexp_extensions/logical_operators.rb +2 -1
- data/lib/reek/ast/sexp_extensions/methods.rb +5 -6
- data/lib/reek/ast/sexp_extensions/module.rb +55 -8
- data/lib/reek/ast/sexp_extensions/nested_assignables.rb +1 -0
- data/lib/reek/ast/sexp_extensions/self.rb +1 -0
- data/lib/reek/ast/sexp_extensions/send.rb +1 -4
- data/lib/reek/ast/sexp_extensions/super.rb +1 -0
- data/lib/reek/ast/sexp_extensions/symbols.rb +1 -0
- data/lib/reek/ast/sexp_extensions/variables.rb +1 -0
- data/lib/reek/ast/sexp_extensions/when.rb +1 -0
- data/lib/reek/ast/sexp_extensions/yield.rb +1 -0
- data/lib/reek/ast/sexp_extensions.rb +2 -0
- data/lib/reek/cli/application.rb +5 -3
- data/lib/reek/cli/command/base_command.rb +1 -0
- data/lib/reek/cli/command/report_command.rb +2 -2
- data/lib/reek/cli/command/todo_list_command.rb +9 -8
- data/lib/reek/cli/options.rb +32 -16
- data/lib/reek/cli/silencer.rb +15 -3
- data/lib/reek/cli/status.rb +1 -0
- data/lib/reek/code_comment.rb +14 -16
- data/lib/reek/configuration/app_configuration.rb +34 -28
- data/lib/reek/configuration/configuration_converter.rb +110 -0
- data/lib/reek/configuration/configuration_file_finder.rb +17 -41
- data/lib/reek/configuration/configuration_validator.rb +13 -23
- data/lib/reek/configuration/default_directive.rb +18 -3
- data/lib/reek/configuration/directory_directives.rb +18 -11
- data/lib/reek/configuration/excluded_paths.rb +2 -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 +4 -3
- data/lib/reek/context/class_context.rb +1 -0
- data/lib/reek/context/code_context.rb +49 -44
- data/lib/reek/context/ghost_context.rb +1 -2
- data/lib/reek/context/method_context.rb +26 -18
- data/lib/reek/context/module_context.rb +11 -11
- data/lib/reek/context/root_context.rb +1 -4
- data/lib/reek/context/send_context.rb +3 -2
- data/lib/reek/context/singleton_attribute_context.rb +1 -0
- data/lib/reek/context/singleton_method_context.rb +1 -0
- data/lib/reek/context/statement_counter.rb +1 -0
- data/lib/reek/context/visibility_tracker.rb +1 -0
- data/lib/reek/context_builder.rb +44 -44
- data/lib/reek/detector_repository.rb +12 -11
- data/lib/reek/documentation_link.rb +28 -0
- data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +15 -13
- data/lib/reek/errors/bad_detector_in_comment_error.rb +13 -11
- 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 +43 -0
- data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +14 -12
- data/lib/reek/errors/incomprehensible_source_error.rb +23 -24
- data/lib/reek/errors/syntax_error.rb +41 -0
- data/lib/reek/examiner.rb +24 -22
- data/lib/reek/logging_error_handler.rb +8 -5
- data/lib/reek/rake/task.rb +8 -5
- data/lib/reek/report/base_report.rb +9 -12
- data/lib/reek/report/code_climate/code_climate_configuration.rb +2 -1
- data/lib/reek/report/code_climate/code_climate_configuration.yml +6 -6
- data/lib/reek/report/code_climate/code_climate_fingerprint.rb +1 -0
- data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -0
- data/lib/reek/report/code_climate/code_climate_report.rb +1 -0
- data/lib/reek/report/code_climate.rb +1 -0
- data/lib/reek/report/documentation_link_warning_formatter.rb +17 -0
- data/lib/reek/report/heading_formatter.rb +54 -0
- data/lib/reek/report/html_report.rb +1 -0
- data/lib/reek/report/json_report.rb +2 -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 +2 -2
- data/lib/reek/report/xml_report.rb +4 -3
- data/lib/reek/report/yaml_report.rb +2 -1
- data/lib/reek/report.rb +16 -10
- data/lib/reek/smell_configuration.rb +3 -2
- data/lib/reek/smell_detectors/attribute.rb +6 -11
- data/lib/reek/smell_detectors/base_detector.rb +31 -26
- data/lib/reek/smell_detectors/boolean_parameter.rb +4 -5
- data/lib/reek/smell_detectors/class_variable.rb +6 -14
- data/lib/reek/smell_detectors/control_parameter.rb +19 -33
- data/lib/reek/smell_detectors/data_clump.rb +16 -9
- data/lib/reek/smell_detectors/duplicate_method_call.rb +24 -17
- data/lib/reek/smell_detectors/feature_envy.rb +10 -7
- data/lib/reek/smell_detectors/instance_variable_assumption.rb +15 -23
- data/lib/reek/smell_detectors/irresponsible_module.rb +6 -12
- data/lib/reek/smell_detectors/long_parameter_list.rb +11 -7
- data/lib/reek/smell_detectors/long_yield_list.rb +11 -7
- data/lib/reek/smell_detectors/manual_dispatch.rb +5 -5
- data/lib/reek/smell_detectors/{prima_donna_method.rb → missing_safe_method.rb} +21 -20
- data/lib/reek/smell_detectors/module_initialize.rb +4 -5
- data/lib/reek/smell_detectors/nested_iterators.rb +17 -24
- data/lib/reek/smell_detectors/nil_check.rb +9 -15
- data/lib/reek/smell_detectors/repeated_conditional.rb +14 -11
- data/lib/reek/smell_detectors/subclassed_from_core_class.rb +8 -8
- data/lib/reek/smell_detectors/too_many_constants.rb +11 -9
- data/lib/reek/smell_detectors/too_many_instance_variables.rb +11 -6
- data/lib/reek/smell_detectors/too_many_methods.rb +12 -7
- data/lib/reek/smell_detectors/too_many_statements.rb +11 -6
- data/lib/reek/smell_detectors/uncommunicative_method_name.rb +11 -11
- data/lib/reek/smell_detectors/uncommunicative_module_name.rb +15 -18
- data/lib/reek/smell_detectors/uncommunicative_parameter_name.rb +18 -22
- data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +27 -27
- data/lib/reek/smell_detectors/unused_parameters.rb +5 -6
- data/lib/reek/smell_detectors/unused_private_method.rb +14 -20
- data/lib/reek/smell_detectors/utility_function.rb +13 -16
- data/lib/reek/smell_detectors.rb +2 -1
- data/lib/reek/smell_warning.rb +16 -8
- data/lib/reek/source/source_code.rb +65 -46
- data/lib/reek/source/source_locator.rb +9 -8
- data/lib/reek/spec/should_reek.rb +3 -2
- data/lib/reek/spec/should_reek_of.rb +13 -26
- data/lib/reek/spec/should_reek_only_of.rb +5 -4
- data/lib/reek/spec/smell_matcher.rb +2 -1
- data/lib/reek/spec.rb +7 -6
- data/lib/reek/tree_dresser.rb +9 -8
- data/lib/reek/version.rb +2 -1
- data/lib/reek.rb +1 -0
- data/reek.gemspec +5 -6
- 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 +15 -34
- data/spec/reek/cli/application_spec.rb +52 -42
- 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 -51
- 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 +70 -106
- data/spec/reek/context/ghost_context_spec.rb +9 -9
- data/spec/reek/context/method_context_spec.rb +2 -2
- data/spec/reek/context/module_context_spec.rb +3 -3
- data/spec/reek/context/root_context_spec.rb +1 -1
- data/spec/reek/context/statement_counter_spec.rb +1 -0
- data/spec/reek/context_builder_spec.rb +20 -0
- 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 +137 -29
- data/spec/reek/rake/task_spec.rb +25 -2
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +82 -78
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +6 -6
- data/spec/reek/report/code_climate/code_climate_report_spec.rb +22 -22
- 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 +17 -46
- data/spec/reek/report_spec.rb +3 -3
- data/spec/reek/smell_detectors/base_detector_spec.rb +4 -5
- 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/irresponsible_module_spec.rb +59 -21
- data/spec/reek/smell_detectors/{prima_donna_method_spec.rb → missing_safe_method_spec.rb} +10 -10
- 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 +36 -15
- 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 +21 -10
- data/spec/reek/smell_detectors/utility_function_spec.rb +57 -5
- data/spec/reek/smell_warning_spec.rb +12 -8
- data/spec/reek/source/source_code_spec.rb +27 -38
- data/spec/reek/source/source_locator_spec.rb +42 -12
- data/spec/reek/spec/should_reek_of_spec.rb +25 -30
- data/spec/reek/spec/should_reek_only_of_spec.rb +2 -2
- data/spec/reek/spec/should_reek_spec.rb +8 -8
- data/spec/reek/spec/smell_matcher_spec.rb +23 -23
- data/spec/reek/tree_dresser_spec.rb +12 -17
- data/spec/spec_helper.rb +7 -17
- data/tasks/configuration.rake +8 -5
- metadata +77 -40
- data/defaults.reek +0 -128
- data/features/configuration_files/warn_about_multiple_configuration_files.feature +0 -44
- data/lib/reek/errors/parse_error.rb +0 -19
- data/lib/reek/report/formatter/heading_formatter.rb +0 -51
- data/lib/reek/report/formatter/location_formatter.rb +0 -41
- data/lib/reek/report/formatter/progress_formatter.rb +0 -80
- data/lib/reek/report/formatter/simple_warning_formatter.rb +0 -35
- data/lib/reek/report/formatter/wiki_link_warning_formatter.rb +0 -35
- data/lib/reek/report/formatter.rb +0 -32
- 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/{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
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
Feature: Validate schema
|
|
2
|
+
In order to ensure that I am using the right configuration
|
|
3
|
+
As a user
|
|
4
|
+
I want to be notified when I am using a configuration that violates our schema
|
|
5
|
+
|
|
6
|
+
Scenario: Our generated default configuration
|
|
7
|
+
Given our default configuration file
|
|
8
|
+
And the clean file 'clean.rb'
|
|
9
|
+
When I run reek -c defaults.reek clean.rb
|
|
10
|
+
Then it succeeds
|
|
11
|
+
And it reports nothing
|
|
12
|
+
|
|
13
|
+
Scenario: Detectors, directories and exclude paths all mixed
|
|
14
|
+
Given a file named "config.reek" with:
|
|
15
|
+
"""
|
|
16
|
+
---
|
|
17
|
+
detectors:
|
|
18
|
+
IrresponsibleModule:
|
|
19
|
+
enabled: false
|
|
20
|
+
NestedIterators:
|
|
21
|
+
exclude:
|
|
22
|
+
- "MyWorker#self.class_method"
|
|
23
|
+
- "AnotherWorker#instance_method"
|
|
24
|
+
DataClump:
|
|
25
|
+
max_copies: 3
|
|
26
|
+
min_clump_size: 3
|
|
27
|
+
|
|
28
|
+
directories:
|
|
29
|
+
"web_app/app/controllers":
|
|
30
|
+
NestedIterators:
|
|
31
|
+
enabled: false
|
|
32
|
+
"web_app/app/helpers":
|
|
33
|
+
UtilityFunction:
|
|
34
|
+
enabled: false
|
|
35
|
+
|
|
36
|
+
exclude_paths:
|
|
37
|
+
- lib/legacy
|
|
38
|
+
- lib/rake/legacy_tasks
|
|
39
|
+
"""
|
|
40
|
+
And the clean file 'clean.rb'
|
|
41
|
+
When I run reek -c config.reek clean.rb
|
|
42
|
+
Then it succeeds
|
|
43
|
+
And it reports nothing
|
|
44
|
+
|
|
45
|
+
Scenario: Invalid detector name
|
|
46
|
+
Given a file named "config.reek" with:
|
|
47
|
+
"""
|
|
48
|
+
---
|
|
49
|
+
detectors:
|
|
50
|
+
DoesNotExist:
|
|
51
|
+
enabled: true
|
|
52
|
+
"""
|
|
53
|
+
And the clean file 'clean.rb'
|
|
54
|
+
When I run reek -c config.reek clean.rb
|
|
55
|
+
Then the exit status indicates an error
|
|
56
|
+
And stderr reports:
|
|
57
|
+
"""
|
|
58
|
+
Error: We found some problems with your configuration file: [/detectors/DoesNotExist] key 'DoesNotExist:' is undefined.
|
|
59
|
+
"""
|
|
@@ -7,12 +7,13 @@ Feature: Unused Private Method detector
|
|
|
7
7
|
Given a file named "config.reek" with:
|
|
8
8
|
"""
|
|
9
9
|
---
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
detectors:
|
|
11
|
+
IrresponsibleModule:
|
|
12
|
+
enabled: false
|
|
13
|
+
UnusedPrivateMethod:
|
|
14
|
+
enabled: true
|
|
15
|
+
exclude:
|
|
16
|
+
- Outer::Awesome#foobar
|
|
16
17
|
"""
|
|
17
18
|
And a file named "sample.rb" with:
|
|
18
19
|
"""
|
|
@@ -27,23 +28,24 @@ Feature: Unused Private Method detector
|
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
"""
|
|
30
|
-
When I run
|
|
31
|
+
When I run reek -c config.reek sample.rb
|
|
31
32
|
Then it reports:
|
|
32
33
|
"""
|
|
33
34
|
sample.rb -- 1 warning:
|
|
34
|
-
[4]:UnusedPrivateMethod: Outer::Smelly has the unused private instance method 'foobar'
|
|
35
|
+
[4]:UnusedPrivateMethod: Outer::Smelly has the unused private instance method 'foobar'
|
|
35
36
|
"""
|
|
36
37
|
|
|
37
38
|
Scenario: Use regexes for excluding contexts
|
|
38
39
|
Given a file named "config.reek" with:
|
|
39
40
|
"""
|
|
40
41
|
---
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
detectors:
|
|
43
|
+
IrresponsibleModule:
|
|
44
|
+
enabled: false
|
|
45
|
+
UnusedPrivateMethod:
|
|
46
|
+
enabled: true
|
|
47
|
+
exclude:
|
|
48
|
+
- wesome#foo
|
|
47
49
|
"""
|
|
48
50
|
And a file named "sample.rb" with:
|
|
49
51
|
"""
|
|
@@ -58,9 +60,9 @@ Feature: Unused Private Method detector
|
|
|
58
60
|
end
|
|
59
61
|
end
|
|
60
62
|
"""
|
|
61
|
-
When I run
|
|
63
|
+
When I run reek -c config.reek sample.rb
|
|
62
64
|
Then it reports:
|
|
63
65
|
"""
|
|
64
66
|
sample.rb -- 1 warning:
|
|
65
|
-
[4]:UnusedPrivateMethod: Outer::Smelly has the unused private instance method 'foobar'
|
|
67
|
+
[4]:UnusedPrivateMethod: Outer::Smelly has the unused private instance method 'foobar'
|
|
66
68
|
"""
|
|
@@ -3,7 +3,7 @@ Feature: Offer different ways how to load configuration
|
|
|
3
3
|
Reek can be configured in two ways:
|
|
4
4
|
- Using the cli "-c" switch to pass a configuration file on the command line.
|
|
5
5
|
- Having a Reek configuration file that is automatically found. Reek will
|
|
6
|
-
look for a file ending in .reek in the following places, in order:
|
|
6
|
+
look for a file ending in .reek.yml in the following places, in order:
|
|
7
7
|
- The current working directory
|
|
8
8
|
- The working directory's ancestor directories, traversing all the way up
|
|
9
9
|
to the root.
|
|
@@ -17,8 +17,8 @@ Feature: Offer different ways how to load configuration
|
|
|
17
17
|
And it reports:
|
|
18
18
|
"""
|
|
19
19
|
smelly.rb -- 2 warnings:
|
|
20
|
-
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
21
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
20
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
21
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
22
22
|
"""
|
|
23
23
|
|
|
24
24
|
Scenario: Configuration via CLI
|
|
@@ -30,19 +30,62 @@ Feature: Offer different ways how to load configuration
|
|
|
30
30
|
|
|
31
31
|
Scenario: Configuration file in working directory
|
|
32
32
|
Given the smelly file 'smelly.rb'
|
|
33
|
-
And a
|
|
33
|
+
And a file named ".reek.yml" with:
|
|
34
|
+
"""
|
|
35
|
+
---
|
|
36
|
+
detectors:
|
|
37
|
+
UncommunicativeMethodName:
|
|
38
|
+
enabled: false
|
|
39
|
+
UncommunicativeVariableName:
|
|
40
|
+
enabled: false
|
|
41
|
+
"""
|
|
34
42
|
When I run reek smelly.rb
|
|
35
43
|
Then it reports no errors
|
|
36
44
|
And it succeeds
|
|
37
45
|
|
|
38
|
-
Scenario:
|
|
39
|
-
Given the smelly file 'smelly.rb'
|
|
40
|
-
And a
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
Scenario: Do not use the default config file when we explicitly specify one configuration file
|
|
47
|
+
Given the smelly file 'smelly.rb'
|
|
48
|
+
And a file named "config.reek" with:
|
|
49
|
+
"""
|
|
50
|
+
---
|
|
51
|
+
detectors:
|
|
52
|
+
UncommunicativeMethodName:
|
|
53
|
+
enabled: false
|
|
54
|
+
"""
|
|
55
|
+
And a file named ".reek.yml" with:
|
|
56
|
+
"""
|
|
57
|
+
---
|
|
58
|
+
UncommunicativeVariableName:
|
|
59
|
+
enabled: false
|
|
60
|
+
"""
|
|
61
|
+
When I run reek -c config.reek smelly.rb
|
|
62
|
+
Then the exit status indicates smells
|
|
63
|
+
And it reports:
|
|
64
|
+
"""
|
|
65
|
+
smelly.rb -- 1 warning:
|
|
66
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
Scenario: Prefer the default config file over other configuration files
|
|
70
|
+
Given the smelly file 'smelly.rb'
|
|
71
|
+
And a file named "config.reek" with:
|
|
72
|
+
"""
|
|
73
|
+
---
|
|
74
|
+
detectors:
|
|
75
|
+
UncommunicativeMethodName:
|
|
76
|
+
enabled: false
|
|
77
|
+
"""
|
|
78
|
+
And a file named ".reek.yml" with:
|
|
79
|
+
"""
|
|
80
|
+
---
|
|
81
|
+
detectors:
|
|
82
|
+
UncommunicativeVariableName:
|
|
83
|
+
enabled: false
|
|
84
|
+
"""
|
|
85
|
+
When I run reek smelly.rb
|
|
43
86
|
Then the exit status indicates smells
|
|
44
87
|
And it reports:
|
|
45
88
|
"""
|
|
46
89
|
smelly.rb -- 1 warning:
|
|
47
|
-
[
|
|
90
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
48
91
|
"""
|
|
@@ -33,8 +33,8 @@ Feature: Erroneous source comments are handled properly
|
|
|
33
33
|
And it reports:
|
|
34
34
|
"""
|
|
35
35
|
smelly.rb -- 2 warnings:
|
|
36
|
-
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
37
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
36
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
37
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
38
38
|
2 total warnings
|
|
39
39
|
"""
|
|
40
40
|
|
|
@@ -48,7 +48,7 @@ Feature: Erroneous source comments are handled properly
|
|
|
48
48
|
"""
|
|
49
49
|
When I run reek bad_comment.rb
|
|
50
50
|
Then it reports the error "Error: You are trying to configure the smell detector 'UncommunicativeMethodName'"
|
|
51
|
-
And it reports the error "Unfortunately we
|
|
51
|
+
And it reports the error "Unfortunately we cannot parse the configuration you have given."
|
|
52
52
|
And it reports the error "The source is 'bad_comment.rb'"
|
|
53
53
|
And it reports the error "the comment belongs to the expression starting in line 3"
|
|
54
54
|
|
|
@@ -48,7 +48,7 @@ Feature: Well formed source comments are handled properly
|
|
|
48
48
|
And it reports:
|
|
49
49
|
"""
|
|
50
50
|
enable_detector_explicitly.rb -- 1 warning:
|
|
51
|
-
[3]:TooManyInstanceVariables: Alfa has at least 5 instance variables
|
|
51
|
+
[3]:TooManyInstanceVariables: Alfa has at least 5 instance variables
|
|
52
52
|
"""
|
|
53
53
|
|
|
54
54
|
Scenario: Configure smell detector with the basic exclude option as string
|
|
@@ -112,5 +112,5 @@ Feature: Well formed source comments are handled properly
|
|
|
112
112
|
And it reports:
|
|
113
113
|
"""
|
|
114
114
|
configure_detector_specific_option.rb -- 1 warning:
|
|
115
|
-
[3]:TooManyInstanceVariables: Alfa has at least 3 instance variables
|
|
115
|
+
[3]:TooManyInstanceVariables: Alfa has at least 3 instance variables
|
|
116
116
|
"""
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Feature: Handling different locales
|
|
2
|
+
In order to work in a variety of environments
|
|
3
|
+
As a developer
|
|
4
|
+
I want Reek to work properly in any locale
|
|
5
|
+
|
|
6
|
+
Scenario: Running Reek in an UTF-8 locale
|
|
7
|
+
Given I set the environment variable "LANG" to "en_US.utf8"
|
|
8
|
+
And a file "konnichiwa.rb" with:
|
|
9
|
+
"""
|
|
10
|
+
puts 'こんにちは世界'
|
|
11
|
+
"""
|
|
12
|
+
When I run reek -V konnichiwa.rb
|
|
13
|
+
Then it succeeds
|
|
14
|
+
And it reports no errors
|
|
15
|
+
And it reports:
|
|
16
|
+
"""
|
|
17
|
+
konnichiwa.rb -- 0 warnings
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
Scenario: Running Reek in the POSIX locale
|
|
21
|
+
Given I set the environment variable "LANG" to "POSIX"
|
|
22
|
+
And a file "konnichiwa.rb" with:
|
|
23
|
+
"""
|
|
24
|
+
puts 'こんにちは世界'
|
|
25
|
+
"""
|
|
26
|
+
When I run reek -V konnichiwa.rb
|
|
27
|
+
Then it succeeds
|
|
28
|
+
And it reports no errors
|
|
29
|
+
And it reports:
|
|
30
|
+
"""
|
|
31
|
+
konnichiwa.rb -- 0 warnings
|
|
32
|
+
"""
|
|
@@ -4,95 +4,135 @@ Feature: Reek can be driven through its Task
|
|
|
4
4
|
|
|
5
5
|
Scenario: source_files points at the desired files
|
|
6
6
|
Given the smelly file 'smelly.rb'
|
|
7
|
-
|
|
7
|
+
And a file "Rakefile" with:
|
|
8
8
|
"""
|
|
9
|
+
require 'reek/rake/task'
|
|
10
|
+
|
|
9
11
|
Reek::Rake::Task.new do |t|
|
|
10
12
|
t.source_files = 'smelly.rb'
|
|
11
|
-
t.reek_opts = '--no-color'
|
|
13
|
+
t.reek_opts = '--no-color --no-documentation'
|
|
12
14
|
end
|
|
13
15
|
"""
|
|
16
|
+
When I run `rake reek`
|
|
14
17
|
Then the exit status indicates an error
|
|
15
18
|
And it reports:
|
|
16
19
|
"""
|
|
17
20
|
smelly.rb -- 2 warnings:
|
|
18
|
-
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
19
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
21
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
22
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
20
23
|
"""
|
|
21
24
|
|
|
22
25
|
Scenario: source_files using a FileList instead of a String
|
|
23
26
|
Given the smelly file 'smelly.rb'
|
|
24
|
-
|
|
27
|
+
And a file "Rakefile" with:
|
|
25
28
|
"""
|
|
29
|
+
require 'reek/rake/task'
|
|
30
|
+
|
|
26
31
|
Reek::Rake::Task.new do |t|
|
|
27
32
|
t.source_files = FileList['smelly.*']
|
|
28
|
-
t.reek_opts = '--no-color'
|
|
33
|
+
t.reek_opts = '--no-color --no-documentation'
|
|
29
34
|
end
|
|
30
35
|
"""
|
|
36
|
+
When I run `rake reek`
|
|
31
37
|
Then the exit status indicates an error
|
|
32
38
|
And it reports:
|
|
33
39
|
"""
|
|
34
40
|
smelly.rb -- 2 warnings:
|
|
35
|
-
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
36
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
41
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
42
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
37
43
|
"""
|
|
38
44
|
|
|
39
45
|
Scenario: name changes the task name
|
|
40
46
|
Given the smelly file 'smelly.rb'
|
|
41
|
-
|
|
47
|
+
And a file "Rakefile" with:
|
|
42
48
|
"""
|
|
49
|
+
require 'reek/rake/task'
|
|
50
|
+
|
|
43
51
|
Reek::Rake::Task.new('silky') do |t|
|
|
44
52
|
t.source_files = 'smelly.rb'
|
|
45
|
-
t.reek_opts = '--no-color'
|
|
53
|
+
t.reek_opts = '--no-color --no-documentation'
|
|
46
54
|
end
|
|
47
55
|
"""
|
|
56
|
+
When I run `rake silky`
|
|
48
57
|
Then the exit status indicates an error
|
|
49
58
|
And it reports:
|
|
50
59
|
"""
|
|
51
60
|
smelly.rb -- 2 warnings:
|
|
52
|
-
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
53
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
61
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
62
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
54
63
|
"""
|
|
55
64
|
|
|
56
65
|
Scenario: verbose prints the reek command
|
|
57
66
|
Given the smelly file 'smelly.rb'
|
|
58
|
-
|
|
67
|
+
And a file "Rakefile" with:
|
|
59
68
|
"""
|
|
69
|
+
require 'reek/rake/task'
|
|
70
|
+
|
|
60
71
|
Reek::Rake::Task.new do |t|
|
|
61
72
|
t.source_files = 'smelly.rb'
|
|
62
73
|
t.verbose = true
|
|
63
74
|
end
|
|
64
75
|
"""
|
|
76
|
+
When I run `rake reek`
|
|
65
77
|
Then the exit status indicates an error
|
|
66
78
|
And stdout includes "Running 'reek' rake command"
|
|
67
79
|
|
|
68
80
|
Scenario: fail_on_error can hide the error status
|
|
69
81
|
Given the smelly file 'smelly.rb'
|
|
70
|
-
|
|
82
|
+
And a file "Rakefile" with:
|
|
71
83
|
"""
|
|
84
|
+
require 'reek/rake/task'
|
|
85
|
+
|
|
72
86
|
Reek::Rake::Task.new do |t|
|
|
73
87
|
t.fail_on_error = false
|
|
74
88
|
t.source_files = 'smelly.rb'
|
|
75
|
-
t.reek_opts = '--no-color'
|
|
89
|
+
t.reek_opts = '--no-color --no-documentation'
|
|
76
90
|
end
|
|
77
91
|
"""
|
|
92
|
+
When I run `rake reek`
|
|
78
93
|
Then it reports no errors
|
|
79
94
|
And it succeeds
|
|
80
95
|
And it reports:
|
|
81
96
|
"""
|
|
82
97
|
smelly.rb -- 2 warnings:
|
|
83
|
-
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
84
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
98
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
99
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
85
100
|
"""
|
|
86
101
|
|
|
87
102
|
Scenario: can be configured with config_file
|
|
88
103
|
Given the smelly file 'smelly.rb'
|
|
89
104
|
And a configuration file 'full_mask.reek'
|
|
90
|
-
|
|
105
|
+
And a file "Rakefile" with:
|
|
91
106
|
"""
|
|
107
|
+
require 'reek/rake/task'
|
|
108
|
+
|
|
92
109
|
Reek::Rake::Task.new do |t|
|
|
93
110
|
t.config_file = 'full_mask.reek'
|
|
94
111
|
t.source_files = 'smelly.rb'
|
|
95
112
|
end
|
|
96
113
|
"""
|
|
114
|
+
When I run `rake reek`
|
|
97
115
|
Then it succeeds
|
|
98
116
|
And it reports nothing
|
|
117
|
+
|
|
118
|
+
Scenario: REEK_SRC overrides the files to check
|
|
119
|
+
Given the smelly file 'smelly.rb'
|
|
120
|
+
And the clean file 'clean.rb'
|
|
121
|
+
And a file "Rakefile" with:
|
|
122
|
+
"""
|
|
123
|
+
require 'reek/rake/task'
|
|
124
|
+
|
|
125
|
+
Reek::Rake::Task.new do |t|
|
|
126
|
+
t.source_files = 'clean.rb'
|
|
127
|
+
t.reek_opts = '--no-color --no-documentation'
|
|
128
|
+
end
|
|
129
|
+
"""
|
|
130
|
+
When I set the environment variable "REEK_SRC" to "smelly.rb"
|
|
131
|
+
And I run `rake reek`
|
|
132
|
+
Then the exit status indicates an error
|
|
133
|
+
And it reports:
|
|
134
|
+
"""
|
|
135
|
+
smelly.rb -- 2 warnings:
|
|
136
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
|
|
137
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
|
138
|
+
"""
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
Feature: Report smells using Code Climate format
|
|
2
|
+
In order to run as an Engine on Code Climate, output format following their
|
|
3
|
+
spec.
|
|
4
|
+
|
|
5
|
+
Scenario: output is empty when there are no smells
|
|
6
|
+
Given a directory called 'clean' containing two clean files
|
|
7
|
+
When I run reek --format code_climate clean
|
|
8
|
+
Then it succeeds
|
|
9
|
+
And it reports this Code Climate output:
|
|
10
|
+
"""
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
Scenario: Indicate smells and print them as JSON when using files
|
|
14
|
+
Given the smelly file 'smelly.rb'
|
|
15
|
+
When I run reek --format code_climate smelly.rb
|
|
16
|
+
Then it reports this Code Climate output:
|
|
17
|
+
"""
|
|
18
|
+
{
|
|
19
|
+
"type": "issue",
|
|
20
|
+
"check_name": "UncommunicativeMethodName",
|
|
21
|
+
"description": "Smelly#x has the name 'x'",
|
|
22
|
+
"categories": [
|
|
23
|
+
"Complexity"
|
|
24
|
+
],
|
|
25
|
+
"location": {
|
|
26
|
+
"path": "smelly.rb",
|
|
27
|
+
"lines": {
|
|
28
|
+
"begin": 4,
|
|
29
|
+
"end": 4
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"remediation_points": 150000,
|
|
33
|
+
"content": {
|
|
34
|
+
"body": "An `Uncommunicative Method Name` is a method name that doesn't communicate its intent well enough.\n\nPoor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.\n"
|
|
35
|
+
},
|
|
36
|
+
"fingerprint": "2b41a3a4bb7de31ac4f5944bf68b7f5f"
|
|
37
|
+
}
|
|
38
|
+
NULL_BYTE_CHARACTER
|
|
39
|
+
{
|
|
40
|
+
"type": "issue",
|
|
41
|
+
"check_name": "UncommunicativeVariableName",
|
|
42
|
+
"description": "Smelly#x has the variable name 'y'",
|
|
43
|
+
"categories": [
|
|
44
|
+
"Complexity"
|
|
45
|
+
],
|
|
46
|
+
"location": {
|
|
47
|
+
"path": "smelly.rb",
|
|
48
|
+
"lines": {
|
|
49
|
+
"begin": 5,
|
|
50
|
+
"end": 5
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"remediation_points": 150000,
|
|
54
|
+
"content": {
|
|
55
|
+
"body": "An `Uncommunicative Variable Name` is a variable name that doesn't communicate its intent well enough.\n\nPoor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.\n"
|
|
56
|
+
},
|
|
57
|
+
"fingerprint": "72f0dc8f8da5f9d7b8b29318636e5609"
|
|
58
|
+
}
|
|
59
|
+
"""
|
|
@@ -24,7 +24,7 @@ Feature: Report smells using simple JSON layout
|
|
|
24
24
|
"context": "Smelly#x",
|
|
25
25
|
"lines": [ 4 ],
|
|
26
26
|
"message": "has the name 'x'",
|
|
27
|
-
"
|
|
27
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.0.0/docs/Uncommunicative-Method-Name.md",
|
|
28
28
|
"name": "x"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
@@ -33,7 +33,7 @@ Feature: Report smells using simple JSON layout
|
|
|
33
33
|
"context": "Smelly#x",
|
|
34
34
|
"lines": [ 5 ],
|
|
35
35
|
"message": "has the variable name 'y'",
|
|
36
|
-
"
|
|
36
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.0.0/docs/Uncommunicative-Variable-Name.md",
|
|
37
37
|
"name": "y"
|
|
38
38
|
}
|
|
39
39
|
]
|
|
@@ -53,7 +53,7 @@ Feature: Report smells using simple JSON layout
|
|
|
53
53
|
1
|
|
54
54
|
],
|
|
55
55
|
"message": "has no descriptive comment",
|
|
56
|
-
"
|
|
56
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.0.0/docs/Irresponsible-Module.md"
|
|
57
57
|
}
|
|
58
58
|
]
|
|
59
59
|
"""
|