rubocop 0.87.1
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 +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +225 -0
- data/assets/logo.png +0 -0
- data/assets/output.html.erb +261 -0
- data/bin/console +10 -0
- data/bin/setup +7 -0
- data/config/default.yml +4203 -0
- data/exe/rubocop +17 -0
- data/lib/rubocop.rb +598 -0
- data/lib/rubocop/ast_aliases.rb +8 -0
- data/lib/rubocop/cached_data.rb +58 -0
- data/lib/rubocop/cli.rb +131 -0
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +140 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +76 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/comment_config.rb +206 -0
- data/lib/rubocop/config.rb +281 -0
- data/lib/rubocop/config_loader.rb +236 -0
- data/lib/rubocop/config_loader_resolver.rb +234 -0
- data/lib/rubocop/config_obsoletion.rb +277 -0
- data/lib/rubocop/config_store.rb +58 -0
- data/lib/rubocop/config_validator.rb +223 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +95 -0
- data/lib/rubocop/cop/badge.rb +73 -0
- data/lib/rubocop/cop/base.rb +399 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +59 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
- data/lib/rubocop/cop/commissioner.rb +122 -0
- data/lib/rubocop/cop/cop.rb +160 -0
- data/lib/rubocop/cop/corrector.rb +119 -0
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
- data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
- data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
- data/lib/rubocop/cop/force.rb +42 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +104 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
- data/lib/rubocop/cop/generator.rb +223 -0
- data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
- data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
- data/lib/rubocop/cop/ignored_node.rb +36 -0
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +41 -0
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +93 -0
- data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
- data/lib/rubocop/cop/layout/assignment_indentation.rb +55 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
- data/lib/rubocop/cop/layout/block_end_newline.rb +64 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
- data/lib/rubocop/cop/layout/class_structure.rb +308 -0
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
- data/lib/rubocop/cop/layout/comment_indentation.rb +141 -0
- data/lib/rubocop/cop/layout/condition_position.rb +66 -0
- data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
- data/lib/rubocop/cop/layout/dot_position.rb +105 -0
- data/lib/rubocop/cop/layout/else_alignment.rb +142 -0
- data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +152 -0
- data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +211 -0
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +121 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +92 -0
- data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +251 -0
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +184 -0
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +53 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +100 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +365 -0
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
- data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
- data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
- data/lib/rubocop/cop/layout/indentation_width.rb +362 -0
- data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
- data/lib/rubocop/cop/layout/leading_comment_space.rb +119 -0
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
- data/lib/rubocop/cop/layout/line_length.rb +280 -0
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +154 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +118 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +123 -0
- data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +191 -0
- data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
- data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
- data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +163 -0
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
- data/lib/rubocop/cop/layout/space_around_keyword.rb +244 -0
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +242 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +150 -0
- data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +33 -0
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +75 -0
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +82 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +200 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +113 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +77 -0
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +96 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +57 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
- data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +50 -0
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/debugger.rb +77 -0
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +38 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +235 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
- data/lib/rubocop/cop/lint/else_layout.rb +66 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
- data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
- data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
- data/lib/rubocop/cop/lint/empty_when.rb +61 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +63 -0
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
- data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +195 -0
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
- data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
- data/lib/rubocop/cop/lint/interpolation_check.rb +53 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +135 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
- data/lib/rubocop/cop/lint/loop.rb +65 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
- data/lib/rubocop/cop/lint/multiple_comparison.rb +48 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +91 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +71 -0
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
- data/lib/rubocop/cop/lint/raise_exception.rb +83 -0
- data/lib/rubocop/cop/lint/rand_one.rb +45 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +264 -0
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +50 -0
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +172 -0
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +59 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +35 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
- data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
- data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +65 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +46 -0
- data/lib/rubocop/cop/lint/script_permission.rb +70 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
- data/lib/rubocop/cop/lint/syntax.rb +42 -0
- data/lib/rubocop/cop/lint/to_json.rb +41 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
- data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +112 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +284 -0
- data/lib/rubocop/cop/lint/useless_assignment.rb +130 -0
- data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +54 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +168 -0
- data/lib/rubocop/cop/lint/void.rb +151 -0
- data/lib/rubocop/cop/message_annotator.rb +129 -0
- data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
- data/lib/rubocop/cop/metrics/block_length.rb +72 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
- data/lib/rubocop/cop/metrics/class_length.rb +59 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +64 -0
- data/lib/rubocop/cop/metrics/method_length.rb +59 -0
- data/lib/rubocop/cop/metrics/module_length.rb +59 -0
- data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/migration/department_name.rb +85 -0
- data/lib/rubocop/cop/mixin/alignment.rb +72 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +57 -0
- data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
- data/lib/rubocop/cop/mixin/code_length.rb +42 -0
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +100 -0
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +45 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
- data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
- data/lib/rubocop/cop/mixin/def_node.rb +33 -0
- data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
- data/lib/rubocop/cop/mixin/duplication.rb +46 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
- data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +72 -0
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +32 -0
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +62 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +147 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
- data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
- data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
- data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
- data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
- data/lib/rubocop/cop/mixin/match_range.rb +26 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +62 -0
- data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
- data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
- data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
- data/lib/rubocop/cop/mixin/nil_methods.rb +23 -0
- data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +61 -0
- data/lib/rubocop/cop/mixin/parentheses.rb +16 -0
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
- data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
- data/lib/rubocop/cop/mixin/range_help.rb +117 -0
- data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +56 -0
- data/lib/rubocop/cop/mixin/string_help.rb +35 -0
- data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
- data/lib/rubocop/cop/mixin/surrounding_space.rb +151 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +20 -0
- data/lib/rubocop/cop/mixin/too_many_lines.rb +25 -0
- data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
- data/lib/rubocop/cop/mixin/trailing_comma.rb +212 -0
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +113 -0
- data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +95 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
- data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +43 -0
- data/lib/rubocop/cop/naming/constant_name.rb +82 -0
- data/lib/rubocop/cop/naming/file_name.rb +223 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
- data/lib/rubocop/cop/naming/method_name.rb +79 -0
- data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
- data/lib/rubocop/cop/naming/predicate_name.rb +106 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
- data/lib/rubocop/cop/naming/variable_name.rb +52 -0
- data/lib/rubocop/cop/naming/variable_number.rb +61 -0
- data/lib/rubocop/cop/offense.rb +230 -0
- data/lib/rubocop/cop/registry.rb +276 -0
- data/lib/rubocop/cop/security/eval.rb +31 -0
- data/lib/rubocop/cop/security/json_load.rb +46 -0
- data/lib/rubocop/cop/security/marshal_load.rb +39 -0
- data/lib/rubocop/cop/security/open.rb +71 -0
- data/lib/rubocop/cop/security/yaml_load.rb +37 -0
- data/lib/rubocop/cop/severity.rb +75 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
- data/lib/rubocop/cop/style/accessor_grouping.rb +140 -0
- data/lib/rubocop/cop/style/alias.rb +147 -0
- data/lib/rubocop/cop/style/and_or.rb +145 -0
- data/lib/rubocop/cop/style/array_join.rb +39 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
- data/lib/rubocop/cop/style/attr.rb +68 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
- data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
- data/lib/rubocop/cop/style/begin_block.rb +22 -0
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +145 -0
- data/lib/rubocop/cop/style/block_comments.rb +70 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +382 -0
- data/lib/rubocop/cop/style/case_equality.rb +53 -0
- data/lib/rubocop/cop/style/character_literal.rb +53 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
- data/lib/rubocop/cop/style/class_check.rb +59 -0
- data/lib/rubocop/cop/style/class_methods.rb +60 -0
- data/lib/rubocop/cop/style/class_vars.rb +69 -0
- data/lib/rubocop/cop/style/collection_methods.rb +79 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
- data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
- data/lib/rubocop/cop/style/command_literal.rb +187 -0
- data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +666 -0
- data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
- data/lib/rubocop/cop/style/copyright.rb +99 -0
- data/lib/rubocop/cop/style/date_time.rb +77 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
- data/lib/rubocop/cop/style/dir.rb +48 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
- data/lib/rubocop/cop/style/documentation.rb +135 -0
- data/lib/rubocop/cop/style/documentation_method.rb +125 -0
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
- data/lib/rubocop/cop/style/double_negation.rb +72 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
- data/lib/rubocop/cop/style/each_with_object.rb +110 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +109 -0
- data/lib/rubocop/cop/style/empty_else.rb +175 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
- data/lib/rubocop/cop/style/empty_literal.rb +121 -0
- data/lib/rubocop/cop/style/empty_method.rb +111 -0
- data/lib/rubocop/cop/style/encoding.rb +56 -0
- data/lib/rubocop/cop/style/end_block.rb +31 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
- data/lib/rubocop/cop/style/even_odd.rb +58 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
- data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
- data/lib/rubocop/cop/style/float_division.rb +94 -0
- data/lib/rubocop/cop/style/for.rb +88 -0
- data/lib/rubocop/cop/style/format_string.rb +127 -0
- data/lib/rubocop/cop/style/format_string_token.rb +120 -0
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +234 -0
- data/lib/rubocop/cop/style/global_vars.rb +80 -0
- data/lib/rubocop/cop/style/guard_clause.rb +145 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +221 -0
- data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
- data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
- data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +189 -0
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +51 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +46 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
- data/lib/rubocop/cop/style/infinite_loop.rb +128 -0
- data/lib/rubocop/cop/style/inline_comment.rb +34 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +197 -0
- data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
- data/lib/rubocop/cop/style/lambda.rb +132 -0
- data/lib/rubocop/cop/style/lambda_call.rb +73 -0
- data/lib/rubocop/cop/style/line_end_concatenation.rb +125 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +190 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +75 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +166 -0
- data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
- data/lib/rubocop/cop/style/min_max.rb +68 -0
- data/lib/rubocop/cop/style/missing_else.rb +180 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
- data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
- data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
- data/lib/rubocop/cop/style/module_function.rb +150 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +49 -0
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +49 -0
- data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
- data/lib/rubocop/cop/style/mutable_constant.rb +172 -0
- data/lib/rubocop/cop/style/negated_if.rb +99 -0
- data/lib/rubocop/cop/style/negated_unless.rb +89 -0
- data/lib/rubocop/cop/style/negated_while.rb +48 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +107 -0
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +64 -0
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +59 -0
- data/lib/rubocop/cop/style/next.rb +244 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
- data/lib/rubocop/cop/style/non_nil_check.rb +136 -0
- data/lib/rubocop/cop/style/not.rb +82 -0
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +114 -0
- data/lib/rubocop/cop/style/numeric_predicate.rb +138 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +98 -0
- data/lib/rubocop/cop/style/option_hash.rb +55 -0
- data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
- data/lib/rubocop/cop/style/or_assignment.rb +96 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
- data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
- data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
- data/lib/rubocop/cop/style/proc.rb +34 -0
- data/lib/rubocop/cop/style/raise_args.rb +145 -0
- data/lib/rubocop/cop/style/random_with_offset.rb +152 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
- data/lib/rubocop/cop/style/redundant_capital_w.rb +51 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
- data/lib/rubocop/cop/style/redundant_conditional.rb +98 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +64 -0
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
- data/lib/rubocop/cop/style/redundant_interpolation.rb +98 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +233 -0
- data/lib/rubocop/cop/style/redundant_percent_q.rb +112 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
- data/lib/rubocop/cop/style/redundant_return.rb +169 -0
- data/lib/rubocop/cop/style/redundant_self.rb +168 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
- data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
- data/lib/rubocop/cop/style/return_nil.rb +89 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +271 -0
- data/lib/rubocop/cop/style/sample.rb +144 -0
- data/lib/rubocop/cop/style/self_assignment.rb +97 -0
- data/lib/rubocop/cop/style/semicolon.rb +101 -0
- data/lib/rubocop/cop/style/send.rb +31 -0
- data/lib/rubocop/cop/style/signal_exception.rb +211 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +207 -0
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +83 -0
- data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
- data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
- data/lib/rubocop/cop/style/string_literals.rb +129 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
- data/lib/rubocop/cop/style/string_methods.rb +46 -0
- data/lib/rubocop/cop/style/strip.rb +46 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +60 -0
- data/lib/rubocop/cop/style/symbol_array.rb +119 -0
- data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +220 -0
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +109 -0
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +165 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +192 -0
- data/lib/rubocop/cop/style/unless_else.rb +55 -0
- data/lib/rubocop/cop/style/unpack_first.rb +61 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
- data/lib/rubocop/cop/style/when_then.rb +37 -0
- data/lib/rubocop/cop/style/while_until_do.rb +59 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
- data/lib/rubocop/cop/style/word_array.rb +102 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +173 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
- data/lib/rubocop/cop/team.rb +256 -0
- data/lib/rubocop/cop/util.rb +151 -0
- data/lib/rubocop/cop/utils/format_string.rb +137 -0
- data/lib/rubocop/cop/variable_force.rb +463 -0
- data/lib/rubocop/cop/variable_force/assignment.rb +97 -0
- data/lib/rubocop/cop/variable_force/branch.rb +320 -0
- data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
- data/lib/rubocop/cop/variable_force/reference.rb +49 -0
- data/lib/rubocop/cop/variable_force/scope.rb +110 -0
- data/lib/rubocop/cop/variable_force/variable.rb +114 -0
- data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
- data/lib/rubocop/core_ext/string.rb +23 -0
- data/lib/rubocop/error.rb +34 -0
- data/lib/rubocop/ext/processed_source.rb +18 -0
- data/lib/rubocop/file_finder.rb +42 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
- data/lib/rubocop/formatter/base_formatter.rb +119 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +57 -0
- data/lib/rubocop/formatter/colorizable.rb +41 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +216 -0
- data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
- data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
- data/lib/rubocop/formatter/formatter_set.rb +104 -0
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
- data/lib/rubocop/formatter/html_formatter.rb +141 -0
- data/lib/rubocop/formatter/json_formatter.rb +81 -0
- data/lib/rubocop/formatter/junit_formatter.rb +84 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/progress_formatter.rb +63 -0
- data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
- data/lib/rubocop/formatter/tap_formatter.rb +82 -0
- data/lib/rubocop/formatter/text_util.rb +20 -0
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
- data/lib/rubocop/magic_comment.rb +214 -0
- data/lib/rubocop/name_similarity.rb +28 -0
- data/lib/rubocop/options.rb +488 -0
- data/lib/rubocop/path_util.rb +85 -0
- data/lib/rubocop/platform.rb +11 -0
- data/lib/rubocop/rake_task.rb +77 -0
- data/lib/rubocop/remote_config.rb +104 -0
- data/lib/rubocop/result_cache.rb +205 -0
- data/lib/rubocop/rspec/cop_helper.rb +71 -0
- data/lib/rubocop/rspec/expect_offense.rb +288 -0
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
- data/lib/rubocop/rspec/shared_contexts.rb +129 -0
- data/lib/rubocop/rspec/support.rb +13 -0
- data/lib/rubocop/runner.rb +388 -0
- data/lib/rubocop/string_interpreter.rb +57 -0
- data/lib/rubocop/target_finder.rb +196 -0
- data/lib/rubocop/target_ruby.rb +154 -0
- data/lib/rubocop/version.rb +23 -0
- data/lib/rubocop/warning.rb +11 -0
- data/lib/rubocop/yaml_duplication_checker.rb +39 -0
- metadata +795 -0
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Formatter
|
5
|
+
# This formatter formats report data using the Test Anything Protocol.
|
6
|
+
# TAP allows for to communicate tests results in a language agnostics way.
|
7
|
+
class TapFormatter < ClangStyleFormatter
|
8
|
+
def started(target_files)
|
9
|
+
super
|
10
|
+
@progress_count = 1
|
11
|
+
output.puts "1..#{target_files.size}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def file_finished(file, offenses)
|
15
|
+
if offenses.empty?
|
16
|
+
output.puts "ok #{@progress_count} - #{smart_path(file)}"
|
17
|
+
else
|
18
|
+
output.puts "not ok #{@progress_count} - #{smart_path(file)}"
|
19
|
+
|
20
|
+
count_stats(offenses)
|
21
|
+
report_file(file, offenses)
|
22
|
+
end
|
23
|
+
|
24
|
+
@progress_count += 1
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def report_line(location)
|
30
|
+
source_line = location.source_line
|
31
|
+
|
32
|
+
if location.first_line == location.last_line
|
33
|
+
output.puts("# #{source_line}")
|
34
|
+
else
|
35
|
+
output.puts("# #{source_line} #{yellow(ELLIPSES)}")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def report_highlighted_area(highlighted_area)
|
40
|
+
output.puts("# #{' ' * highlighted_area.begin_pos}" \
|
41
|
+
"#{'^' * highlighted_area.size}")
|
42
|
+
end
|
43
|
+
|
44
|
+
def report_offense(file, offense)
|
45
|
+
output.printf(
|
46
|
+
"# %<path>s:%<line>d:%<column>d: %<severity>s: %<message>s\n",
|
47
|
+
path: cyan(smart_path(file)),
|
48
|
+
line: offense.line,
|
49
|
+
column: offense.real_column,
|
50
|
+
severity: colored_severity_code(offense),
|
51
|
+
message: message(offense)
|
52
|
+
)
|
53
|
+
|
54
|
+
begin
|
55
|
+
return unless valid_line?(offense)
|
56
|
+
|
57
|
+
report_line(offense.location)
|
58
|
+
report_highlighted_area(offense.highlighted_area)
|
59
|
+
rescue IndexError
|
60
|
+
# range is not on a valid line; perhaps the source file is empty
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def annotate_message(msg)
|
65
|
+
msg.gsub(/`(.*?)`/, '\1')
|
66
|
+
end
|
67
|
+
|
68
|
+
def message(offense)
|
69
|
+
message =
|
70
|
+
if offense.corrected_with_todo?
|
71
|
+
'[Todo] '
|
72
|
+
elsif offense.corrected?
|
73
|
+
'[Corrected] '
|
74
|
+
else
|
75
|
+
''
|
76
|
+
end
|
77
|
+
|
78
|
+
"#{message}#{annotate_message(offense.message)}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Formatter
|
5
|
+
# Common logic for UI texts.
|
6
|
+
module TextUtil
|
7
|
+
module_function
|
8
|
+
|
9
|
+
def pluralize(number, thing, options = {})
|
10
|
+
if number.zero? && options[:no_for_zero]
|
11
|
+
"no #{thing}s"
|
12
|
+
elsif number == 1
|
13
|
+
"1 #{thing}"
|
14
|
+
else
|
15
|
+
"#{number} #{thing}s"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module RuboCop
|
6
|
+
module Formatter
|
7
|
+
# This formatter displays the list of offensive files, sorted by number of
|
8
|
+
# offenses with the worst offenders first.
|
9
|
+
#
|
10
|
+
# Here's the format:
|
11
|
+
#
|
12
|
+
# 26 this/file/is/really/bad.rb
|
13
|
+
# 3 just/ok.rb
|
14
|
+
# --
|
15
|
+
# 29 Total
|
16
|
+
class WorstOffendersFormatter < BaseFormatter
|
17
|
+
attr_reader :offense_counts
|
18
|
+
|
19
|
+
def started(target_files)
|
20
|
+
super
|
21
|
+
@offense_counts = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def file_finished(file, offenses)
|
25
|
+
return if offenses.empty?
|
26
|
+
|
27
|
+
path = Pathname.new(file).relative_path_from(Pathname.new(Dir.pwd))
|
28
|
+
@offense_counts[path] = offenses.size
|
29
|
+
end
|
30
|
+
|
31
|
+
def finished(_inspected_files)
|
32
|
+
report_summary(@offense_counts)
|
33
|
+
end
|
34
|
+
|
35
|
+
# rubocop:disable Metrics/AbcSize
|
36
|
+
def report_summary(offense_counts)
|
37
|
+
per_file_counts = ordered_offense_counts(offense_counts)
|
38
|
+
total_count = total_offense_count(offense_counts)
|
39
|
+
|
40
|
+
output.puts
|
41
|
+
|
42
|
+
per_file_counts.each do |file_name, count|
|
43
|
+
output.puts "#{count.to_s.ljust(total_count.to_s.length + 2)}" \
|
44
|
+
"#{file_name}\n"
|
45
|
+
end
|
46
|
+
output.puts '--'
|
47
|
+
output.puts "#{total_count} Total"
|
48
|
+
|
49
|
+
output.puts
|
50
|
+
end
|
51
|
+
# rubocop:enable Metrics/AbcSize
|
52
|
+
|
53
|
+
def ordered_offense_counts(offense_counts)
|
54
|
+
Hash[offense_counts.sort_by { |k, v| [-v, k] }]
|
55
|
+
end
|
56
|
+
|
57
|
+
def total_offense_count(offense_counts)
|
58
|
+
offense_counts.values.inject(0, :+)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,214 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
# Parse different formats of magic comments.
|
5
|
+
#
|
6
|
+
# @abstract parent of three different magic comment handlers
|
7
|
+
class MagicComment
|
8
|
+
# @see https://git.io/vMC1C IRB's pattern for matching magic comment tokens
|
9
|
+
TOKEN = /[[:alnum:]\-_]+/.freeze
|
10
|
+
|
11
|
+
# Detect magic comment format and pass it to the appropriate wrapper.
|
12
|
+
#
|
13
|
+
# @param comment [String]
|
14
|
+
#
|
15
|
+
# @return [RuboCop::MagicComment]
|
16
|
+
def self.parse(comment)
|
17
|
+
case comment
|
18
|
+
when EmacsComment::FORMAT then EmacsComment.new(comment)
|
19
|
+
when VimComment::FORMAT then VimComment.new(comment)
|
20
|
+
else
|
21
|
+
SimpleComment.new(comment)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(comment)
|
26
|
+
@comment = comment
|
27
|
+
end
|
28
|
+
|
29
|
+
def any?
|
30
|
+
frozen_string_literal_specified? || encoding_specified?
|
31
|
+
end
|
32
|
+
|
33
|
+
# Does the magic comment enable the frozen string literal feature.
|
34
|
+
#
|
35
|
+
# Test whether the frozen string literal value is `true`. Cannot
|
36
|
+
# just return `frozen_string_literal` since an invalid magic comment
|
37
|
+
# like `# frozen_string_literal: yes` is possible and the truthy value
|
38
|
+
# `'yes'` does not actually enable the feature
|
39
|
+
#
|
40
|
+
# @return [Boolean]
|
41
|
+
def frozen_string_literal?
|
42
|
+
frozen_string_literal == true
|
43
|
+
end
|
44
|
+
|
45
|
+
def valid_literal_value?
|
46
|
+
[true, false].include?(frozen_string_literal)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Was a magic comment for the frozen string literal found?
|
50
|
+
#
|
51
|
+
# @return [Boolean]
|
52
|
+
def frozen_string_literal_specified?
|
53
|
+
specified?(frozen_string_literal)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Expose the `frozen_string_literal` value coerced to a boolean if possible.
|
57
|
+
#
|
58
|
+
# @return [Boolean] if value is `true` or `false`
|
59
|
+
# @return [nil] if frozen_string_literal comment isn't found
|
60
|
+
# @return [String] if comment is found but isn't true or false
|
61
|
+
def frozen_string_literal
|
62
|
+
return unless (setting = extract_frozen_string_literal)
|
63
|
+
|
64
|
+
case setting
|
65
|
+
when 'true' then true
|
66
|
+
when 'false' then false
|
67
|
+
else
|
68
|
+
setting
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def encoding_specified?
|
73
|
+
specified?(encoding)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def specified?(value)
|
79
|
+
!value.nil?
|
80
|
+
end
|
81
|
+
|
82
|
+
# Match the entire comment string with a pattern and take the first capture.
|
83
|
+
#
|
84
|
+
# @param pattern [Regexp]
|
85
|
+
#
|
86
|
+
# @return [String] if pattern matched
|
87
|
+
# @return [nil] otherwise
|
88
|
+
def extract(pattern)
|
89
|
+
@comment[pattern, 1]
|
90
|
+
end
|
91
|
+
|
92
|
+
# Parent to Vim and Emacs magic comment handling.
|
93
|
+
#
|
94
|
+
# @abstract
|
95
|
+
class EditorComment < MagicComment
|
96
|
+
private
|
97
|
+
|
98
|
+
# Find a token starting with the provided keyword and extract its value.
|
99
|
+
#
|
100
|
+
# @param keyword [String]
|
101
|
+
#
|
102
|
+
# @return [String] extracted value if it is found
|
103
|
+
# @return [nil] otherwise
|
104
|
+
def match(keyword)
|
105
|
+
pattern = /\A#{keyword}\s*#{self.class::OPERATOR}\s*(#{TOKEN})\z/
|
106
|
+
|
107
|
+
tokens.each do |token|
|
108
|
+
next unless (value = token[pattern, 1])
|
109
|
+
|
110
|
+
return value.downcase
|
111
|
+
end
|
112
|
+
|
113
|
+
nil
|
114
|
+
end
|
115
|
+
|
116
|
+
# Individual tokens composing an editor specific comment string.
|
117
|
+
#
|
118
|
+
# @return [Array<String>]
|
119
|
+
def tokens
|
120
|
+
extract(self.class::FORMAT).split(self.class::SEPARATOR).map(&:strip)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# Wrapper for Emacs style magic comments.
|
125
|
+
#
|
126
|
+
# @example Emacs style comment
|
127
|
+
# comment = RuboCop::MagicComment.parse(
|
128
|
+
# '# -*- encoding: ASCII-8BIT -*-'
|
129
|
+
# )
|
130
|
+
#
|
131
|
+
# comment.encoding # => 'ascii-8bit'
|
132
|
+
#
|
133
|
+
# @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
|
134
|
+
# @see https://git.io/vMCXh Emacs handling in Ruby's parse.y
|
135
|
+
class EmacsComment < EditorComment
|
136
|
+
FORMAT = /-\*-(.+)-\*-/.freeze
|
137
|
+
SEPARATOR = ';'
|
138
|
+
OPERATOR = ':'
|
139
|
+
|
140
|
+
def encoding
|
141
|
+
match('(?:en)?coding')
|
142
|
+
end
|
143
|
+
|
144
|
+
private
|
145
|
+
|
146
|
+
def extract_frozen_string_literal
|
147
|
+
match('frozen[_-]string[_-]literal')
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Wrapper for Vim style magic comments.
|
152
|
+
#
|
153
|
+
# @example Vim style comment
|
154
|
+
# comment = RuboCop::MagicComment.parse(
|
155
|
+
# '# vim: filetype=ruby, fileencoding=ascii-8bit'
|
156
|
+
# )
|
157
|
+
#
|
158
|
+
# comment.encoding # => 'ascii-8bit'
|
159
|
+
class VimComment < EditorComment
|
160
|
+
FORMAT = /#\s*vim:\s*(.+)/.freeze
|
161
|
+
SEPARATOR = ', '
|
162
|
+
OPERATOR = '='
|
163
|
+
|
164
|
+
# For some reason the fileencoding keyword only works if there
|
165
|
+
# is at least one other token included in the string. For example
|
166
|
+
#
|
167
|
+
# # works
|
168
|
+
# # vim: foo=bar, fileencoding=ascii-8bit
|
169
|
+
#
|
170
|
+
# # does nothing
|
171
|
+
# # vim: foo=bar, fileencoding=ascii-8bit
|
172
|
+
#
|
173
|
+
def encoding
|
174
|
+
match('fileencoding') if tokens.size > 1
|
175
|
+
end
|
176
|
+
|
177
|
+
# Vim comments cannot specify frozen string literal behavior.
|
178
|
+
def frozen_string_literal; end
|
179
|
+
end
|
180
|
+
|
181
|
+
# Wrapper for regular magic comments not bound to an editor.
|
182
|
+
#
|
183
|
+
# Simple comments can only specify one setting per comment.
|
184
|
+
#
|
185
|
+
# @example frozen string literal comments
|
186
|
+
# comment1 = RuboCop::MagicComment.parse('# frozen_string_literal: true')
|
187
|
+
# comment1.frozen_string_literal # => true
|
188
|
+
# comment1.encoding # => nil
|
189
|
+
#
|
190
|
+
# @example encoding comments
|
191
|
+
# comment2 = RuboCop::MagicComment.parse('# encoding: utf-8')
|
192
|
+
# comment2.frozen_string_literal # => nil
|
193
|
+
# comment2.encoding # => 'utf-8'
|
194
|
+
class SimpleComment < MagicComment
|
195
|
+
# Match `encoding` or `coding`
|
196
|
+
def encoding
|
197
|
+
extract(/\A\s*\#.*\b(?:en)?coding: (#{TOKEN})/i)
|
198
|
+
end
|
199
|
+
|
200
|
+
private
|
201
|
+
|
202
|
+
# Extract `frozen_string_literal`.
|
203
|
+
#
|
204
|
+
# The `frozen_string_literal` magic comment only works if it
|
205
|
+
# is the only text in the comment.
|
206
|
+
#
|
207
|
+
# Case-insensitive and dashes/underscores are acceptable.
|
208
|
+
# @see https://git.io/vM7Mg
|
209
|
+
def extract_frozen_string_literal
|
210
|
+
extract(/\A\s*#\s*frozen[_-]string[_-]literal:\s*(#{TOKEN})\s*\z/i)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
# Common functionality for finding names that are similar to a given name.
|
5
|
+
module NameSimilarity
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def find_similar_name(target_name, names)
|
9
|
+
similar_names = find_similar_names(target_name, names)
|
10
|
+
|
11
|
+
similar_names.first
|
12
|
+
end
|
13
|
+
|
14
|
+
def find_similar_names(target_name, names)
|
15
|
+
# DidYouMean::SpellChecker is not available in all versions of Ruby, and
|
16
|
+
# even on versions where it *is* available (>= 2.3), it is not always
|
17
|
+
# required correctly. So we do a feature check first.
|
18
|
+
# See: https://github.com/rubocop-hq/rubocop/issues/7979
|
19
|
+
return [] unless defined?(DidYouMean::SpellChecker)
|
20
|
+
|
21
|
+
names = names.dup
|
22
|
+
names.delete(target_name)
|
23
|
+
|
24
|
+
spell_checker = DidYouMean::SpellChecker.new(dictionary: names)
|
25
|
+
spell_checker.correct(target_name)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,488 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'shellwords'
|
5
|
+
|
6
|
+
module RuboCop
|
7
|
+
class IncorrectCopNameError < StandardError; end
|
8
|
+
class OptionArgumentError < StandardError; end
|
9
|
+
|
10
|
+
# This class handles command line options.
|
11
|
+
class Options
|
12
|
+
E_STDIN_NO_PATH = '-s/--stdin requires exactly one path, relative to the ' \
|
13
|
+
'root of the project. RuboCop will use this path to determine which ' \
|
14
|
+
'cops are enabled (via eg. Include/Exclude), and so that certain cops ' \
|
15
|
+
'like Naming/FileName can be checked.'
|
16
|
+
EXITING_OPTIONS = %i[version verbose_version show_cops].freeze
|
17
|
+
DEFAULT_MAXIMUM_EXCLUSION_ITEMS = 15
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@options = {}
|
21
|
+
@validator = OptionsValidator.new(@options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse(command_line_args)
|
25
|
+
args = args_from_file.concat(args_from_env).concat(command_line_args)
|
26
|
+
define_options.parse!(args)
|
27
|
+
|
28
|
+
@validator.validate_compatibility
|
29
|
+
|
30
|
+
if @options[:stdin]
|
31
|
+
# The parser will put the file name given after --stdin into
|
32
|
+
# @options[:stdin]. If it did, then the args array should be empty.
|
33
|
+
raise OptionArgumentError, E_STDIN_NO_PATH if args.any?
|
34
|
+
|
35
|
+
# We want the STDIN contents in @options[:stdin] and the file name in
|
36
|
+
# args to simplify the rest of the processing.
|
37
|
+
args = [@options[:stdin]]
|
38
|
+
@options[:stdin] = $stdin.binmode.read
|
39
|
+
end
|
40
|
+
|
41
|
+
[@options, args]
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def args_from_file
|
47
|
+
if File.exist?('.rubocop') && !File.directory?('.rubocop')
|
48
|
+
File.read('.rubocop').shellsplit
|
49
|
+
else
|
50
|
+
[]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def args_from_env
|
55
|
+
Shellwords.split(ENV.fetch('RUBOCOP_OPTS', ''))
|
56
|
+
end
|
57
|
+
|
58
|
+
def define_options
|
59
|
+
OptionParser.new do |opts|
|
60
|
+
opts.banner = 'Usage: rubocop [options] [file1, file2, ...]'
|
61
|
+
|
62
|
+
add_list_options(opts)
|
63
|
+
add_only_options(opts)
|
64
|
+
add_configuration_options(opts)
|
65
|
+
add_formatting_options(opts)
|
66
|
+
|
67
|
+
option(opts, '-r', '--require FILE') { |f| require f }
|
68
|
+
|
69
|
+
add_severity_option(opts)
|
70
|
+
add_flags_with_optional_args(opts)
|
71
|
+
add_boolean_flags(opts)
|
72
|
+
add_aliases(opts)
|
73
|
+
|
74
|
+
option(opts, '-s', '--stdin FILE')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_only_options(opts)
|
79
|
+
add_cop_selection_csv_option('except', opts)
|
80
|
+
add_cop_selection_csv_option('only', opts)
|
81
|
+
option(opts, '--only-guide-cops')
|
82
|
+
end
|
83
|
+
|
84
|
+
def add_cop_selection_csv_option(option, opts)
|
85
|
+
option(opts, "--#{option} [COP1,COP2,...]") do |list|
|
86
|
+
unless list
|
87
|
+
message = "--#{option} argument should be [COP1,COP2,...]."
|
88
|
+
|
89
|
+
raise OptionArgumentError, message
|
90
|
+
end
|
91
|
+
|
92
|
+
@options[:"#{option}"] =
|
93
|
+
if list.empty?
|
94
|
+
['']
|
95
|
+
else
|
96
|
+
list.split(',').map do |c|
|
97
|
+
Cop::Cop.qualified_cop_name(c, "--#{option} option")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def add_configuration_options(opts)
|
104
|
+
option(opts, '-c', '--config FILE')
|
105
|
+
option(opts, '--force-exclusion')
|
106
|
+
option(opts, '--only-recognized-file-types')
|
107
|
+
option(opts, '--ignore-parent-exclusion')
|
108
|
+
option(opts, '--force-default-config')
|
109
|
+
add_auto_gen_options(opts)
|
110
|
+
end
|
111
|
+
|
112
|
+
def add_auto_gen_options(opts)
|
113
|
+
option(opts, '--auto-gen-config')
|
114
|
+
|
115
|
+
option(opts, '--exclude-limit COUNT') do
|
116
|
+
@validator.validate_exclude_limit_option
|
117
|
+
end
|
118
|
+
|
119
|
+
option(opts, '--disable-uncorrectable')
|
120
|
+
|
121
|
+
option(opts, '--no-offense-counts') do
|
122
|
+
@options[:no_offense_counts] = true
|
123
|
+
end
|
124
|
+
|
125
|
+
option(opts, '--auto-gen-only-exclude')
|
126
|
+
option(opts, '--no-auto-gen-timestamp') do
|
127
|
+
@options[:no_auto_gen_timestamp] = true
|
128
|
+
end
|
129
|
+
|
130
|
+
option(opts, '--init')
|
131
|
+
end
|
132
|
+
|
133
|
+
def add_formatting_options(opts)
|
134
|
+
option(opts, '-f', '--format FORMATTER') do |key|
|
135
|
+
@options[:formatters] ||= []
|
136
|
+
@options[:formatters] << [key]
|
137
|
+
end
|
138
|
+
|
139
|
+
option(opts, '-o', '--out FILE') do |path|
|
140
|
+
if @options[:formatters]
|
141
|
+
@options[:formatters].last << path
|
142
|
+
else
|
143
|
+
@options[:output_path] = path
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
option(opts, '--display-only-failed')
|
148
|
+
end
|
149
|
+
|
150
|
+
def add_severity_option(opts)
|
151
|
+
table = RuboCop::Cop::Severity::CODE_TABLE.merge(A: :autocorrect)
|
152
|
+
option(opts, '--fail-level SEVERITY',
|
153
|
+
RuboCop::Cop::Severity::NAMES + [:autocorrect],
|
154
|
+
table) do |severity|
|
155
|
+
@options[:fail_level] = severity
|
156
|
+
end
|
157
|
+
option(opts, '--display-only-fail-level-offenses')
|
158
|
+
end
|
159
|
+
|
160
|
+
def add_flags_with_optional_args(opts)
|
161
|
+
option(opts, '--show-cops [COP1,COP2,...]') do |list|
|
162
|
+
@options[:show_cops] = list.nil? ? [] : list.split(',')
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
167
|
+
def add_boolean_flags(opts)
|
168
|
+
option(opts, '-F', '--fail-fast')
|
169
|
+
option(opts, '-C', '--cache FLAG')
|
170
|
+
option(opts, '-d', '--debug')
|
171
|
+
option(opts, '-D', '--[no-]display-cop-names')
|
172
|
+
option(opts, '-E', '--extra-details')
|
173
|
+
option(opts, '-S', '--display-style-guide')
|
174
|
+
option(opts, '-a', '--auto-correct') do
|
175
|
+
@options[:safe_auto_correct] = true
|
176
|
+
end
|
177
|
+
option(opts, '--safe-auto-correct') do
|
178
|
+
warn '--safe-auto-correct is deprecated; use --auto-correct'
|
179
|
+
@options[:safe_auto_correct] = @options[:auto_correct] = true
|
180
|
+
end
|
181
|
+
option(opts, '-A', '--auto-correct-all') do
|
182
|
+
@options[:auto_correct] = true
|
183
|
+
end
|
184
|
+
option(opts, '--disable-pending-cops')
|
185
|
+
option(opts, '--enable-pending-cops')
|
186
|
+
option(opts, '--ignore-disable-comments')
|
187
|
+
|
188
|
+
option(opts, '--safe')
|
189
|
+
|
190
|
+
option(opts, '--[no-]color')
|
191
|
+
|
192
|
+
option(opts, '-v', '--version')
|
193
|
+
option(opts, '-V', '--verbose-version')
|
194
|
+
option(opts, '-P', '--parallel')
|
195
|
+
end
|
196
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
197
|
+
|
198
|
+
def add_aliases(opts)
|
199
|
+
option(opts, '-l', '--lint') do
|
200
|
+
@options[:only] ||= []
|
201
|
+
@options[:only] << 'Lint'
|
202
|
+
end
|
203
|
+
option(opts, '-x', '--fix-layout') do
|
204
|
+
@options[:only] ||= []
|
205
|
+
@options[:only] << 'Layout'
|
206
|
+
@options[:auto_correct] = true
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def add_list_options(opts)
|
211
|
+
option(opts, '-L', '--list-target-files')
|
212
|
+
end
|
213
|
+
|
214
|
+
# Sets a value in the @options hash, based on the given long option and its
|
215
|
+
# value, in addition to calling the block if a block is given.
|
216
|
+
def option(opts, *args)
|
217
|
+
long_opt_symbol = long_opt_symbol(args)
|
218
|
+
args += Array(OptionsHelp::TEXT[long_opt_symbol])
|
219
|
+
opts.on(*args) do |arg|
|
220
|
+
@options[long_opt_symbol] = arg
|
221
|
+
yield arg if block_given?
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
# Finds the option in `args` starting with -- and converts it to a symbol,
|
226
|
+
# e.g. [..., '--auto-correct', ...] to :auto_correct.
|
227
|
+
def long_opt_symbol(args)
|
228
|
+
long_opt = args.find { |arg| arg.start_with?('--') }
|
229
|
+
long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '')
|
230
|
+
.tr('-', '_').gsub(/[\[\]]/, '').to_sym
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# Validates option arguments and the options' compatibility with each other.
|
235
|
+
class OptionsValidator
|
236
|
+
class << self
|
237
|
+
# Cop name validation must be done later than option parsing, so it's not
|
238
|
+
# called from within Options.
|
239
|
+
def validate_cop_list(names)
|
240
|
+
return unless names
|
241
|
+
|
242
|
+
cop_names = Cop::Cop.registry.names
|
243
|
+
departments = Cop::Cop.registry.departments.map(&:to_s)
|
244
|
+
|
245
|
+
names.each do |name|
|
246
|
+
next if cop_names.include?(name)
|
247
|
+
next if departments.include?(name)
|
248
|
+
next if %w[Syntax Lint/Syntax].include?(name)
|
249
|
+
|
250
|
+
raise IncorrectCopNameError, format_message_from(name, cop_names)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
private
|
255
|
+
|
256
|
+
def format_message_from(name, cop_names)
|
257
|
+
message = 'Unrecognized cop or department: %<name>s.'
|
258
|
+
message_with_candidate = "%<message>s\nDid you mean? %<candidate>s"
|
259
|
+
corrections = NameSimilarity.find_similar_names(name, cop_names)
|
260
|
+
|
261
|
+
if corrections.empty?
|
262
|
+
format(message, name: name)
|
263
|
+
else
|
264
|
+
format(message_with_candidate, message: format(message, name: name),
|
265
|
+
candidate: corrections.join(', '))
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def initialize(options)
|
271
|
+
@options = options
|
272
|
+
end
|
273
|
+
|
274
|
+
def validate_cop_options
|
275
|
+
%i[only except].each do |opt|
|
276
|
+
OptionsValidator.validate_cop_list(@options[opt])
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
# rubocop:disable Metrics/AbcSize
|
281
|
+
def validate_compatibility # rubocop:disable Metrics/MethodLength
|
282
|
+
if only_includes_redundant_disable?
|
283
|
+
raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
|
284
|
+
'be used with --only.'
|
285
|
+
end
|
286
|
+
raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
|
287
|
+
unless boolean_or_empty_cache?
|
288
|
+
raise OptionArgumentError, '-C/--cache argument must be true or false'
|
289
|
+
end
|
290
|
+
|
291
|
+
if display_only_fail_level_offenses_with_autocorrect?
|
292
|
+
raise OptionArgumentError, '--autocorrect cannot be used with ' \
|
293
|
+
'--display-only-fail-level-offenses'
|
294
|
+
end
|
295
|
+
validate_auto_gen_config
|
296
|
+
validate_auto_correct
|
297
|
+
validate_display_only_failed
|
298
|
+
validate_parallel
|
299
|
+
|
300
|
+
return if incompatible_options.size <= 1
|
301
|
+
|
302
|
+
raise OptionArgumentError, 'Incompatible cli options: ' \
|
303
|
+
"#{incompatible_options.inspect}"
|
304
|
+
end
|
305
|
+
# rubocop:enable Metrics/AbcSize
|
306
|
+
|
307
|
+
def validate_auto_gen_config
|
308
|
+
return if @options.key?(:auto_gen_config)
|
309
|
+
|
310
|
+
message = '--%<flag>s can only be used together with --auto-gen-config.'
|
311
|
+
|
312
|
+
%i[exclude_limit no_offense_counts no_auto_gen_timestamp
|
313
|
+
auto_gen_only_exclude].each do |option|
|
314
|
+
if @options.key?(option)
|
315
|
+
raise OptionArgumentError,
|
316
|
+
format(message, flag: option.to_s.tr('_', '-'))
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
def validate_display_only_failed
|
322
|
+
return unless @options.key?(:display_only_failed)
|
323
|
+
return if @options[:format] == 'junit'
|
324
|
+
|
325
|
+
raise OptionArgumentError,
|
326
|
+
format('--display-only-failed can only be used together with --format junit.')
|
327
|
+
end
|
328
|
+
|
329
|
+
def validate_auto_correct
|
330
|
+
return if @options.key?(:auto_correct)
|
331
|
+
return unless @options.key?(:disable_uncorrectable)
|
332
|
+
|
333
|
+
raise OptionArgumentError,
|
334
|
+
format('--disable-uncorrectable can only be used together with --auto-correct.')
|
335
|
+
end
|
336
|
+
|
337
|
+
def validate_parallel
|
338
|
+
return unless @options.key?(:parallel)
|
339
|
+
|
340
|
+
if @options[:cache] == 'false'
|
341
|
+
raise OptionArgumentError, '-P/--parallel uses caching to speed up ' \
|
342
|
+
'execution, so combining with --cache ' \
|
343
|
+
'false is not allowed.'
|
344
|
+
end
|
345
|
+
|
346
|
+
validate_parallel_with_combo_option
|
347
|
+
end
|
348
|
+
|
349
|
+
def validate_parallel_with_combo_option
|
350
|
+
combos = {
|
351
|
+
auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
|
352
|
+
'while --auto-gen-config needs a non-cached run, ' \
|
353
|
+
'so they cannot be combined.',
|
354
|
+
fail_fast: '-P/--parallel cannot be combined with -F/--fail-fast.',
|
355
|
+
auto_correct: '-P/--parallel cannot be combined with --auto-correct.'
|
356
|
+
}
|
357
|
+
|
358
|
+
combos.each do |key, msg|
|
359
|
+
raise OptionArgumentError, msg if @options.key?(key)
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
def only_includes_redundant_disable?
|
364
|
+
@options.key?(:only) &&
|
365
|
+
(@options[:only] & %w[Lint/RedundantCopDisableDirective
|
366
|
+
RedundantCopDisableDirective]).any?
|
367
|
+
end
|
368
|
+
|
369
|
+
def display_only_fail_level_offenses_with_autocorrect?
|
370
|
+
@options[:display_only_fail_level_offenses] && @options[:autocorrect]
|
371
|
+
end
|
372
|
+
|
373
|
+
def except_syntax?
|
374
|
+
@options.key?(:except) &&
|
375
|
+
(@options[:except] & %w[Lint/Syntax Syntax]).any?
|
376
|
+
end
|
377
|
+
|
378
|
+
def boolean_or_empty_cache?
|
379
|
+
!@options.key?(:cache) || %w[true false].include?(@options[:cache])
|
380
|
+
end
|
381
|
+
|
382
|
+
def incompatible_options
|
383
|
+
@incompatible_options ||= @options.keys & Options::EXITING_OPTIONS
|
384
|
+
end
|
385
|
+
|
386
|
+
def validate_exclude_limit_option
|
387
|
+
return if /^\d+$/.match?(@options[:exclude_limit])
|
388
|
+
|
389
|
+
# Emulate OptionParser's behavior to make failures consistent regardless
|
390
|
+
# of option order.
|
391
|
+
raise OptionParser::MissingArgument
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
# This module contains help texts for command line options.
|
396
|
+
module OptionsHelp
|
397
|
+
MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
|
398
|
+
FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
|
399
|
+
|
400
|
+
TEXT = {
|
401
|
+
only: 'Run only the given cop(s).',
|
402
|
+
only_guide_cops: ['Run only cops for rules that link to a',
|
403
|
+
'style guide.'],
|
404
|
+
except: 'Disable the given cop(s).',
|
405
|
+
require: 'Require Ruby file.',
|
406
|
+
config: 'Specify configuration file.',
|
407
|
+
auto_gen_config: ['Generate a configuration file acting as a',
|
408
|
+
'TODO list.'],
|
409
|
+
no_offense_counts: ['Do not include offense counts in configuration',
|
410
|
+
'file generated by --auto-gen-config.'],
|
411
|
+
no_auto_gen_timestamp:
|
412
|
+
['Do not include the date and time when',
|
413
|
+
'the --auto-gen-config was run in the file it',
|
414
|
+
'generates.'],
|
415
|
+
auto_gen_only_exclude:
|
416
|
+
['Generate only Exclude parameters and not Max',
|
417
|
+
'when running --auto-gen-config, except if the',
|
418
|
+
'number of files with offenses is bigger than',
|
419
|
+
'exclude-limit.'],
|
420
|
+
exclude_limit: ['Used together with --auto-gen-config to',
|
421
|
+
'set the limit for how many Exclude',
|
422
|
+
"properties to generate. Default is #{MAX_EXCL}."],
|
423
|
+
disable_uncorrectable: ['Used with --auto-correct to annotate any',
|
424
|
+
'offenses that do not support autocorrect',
|
425
|
+
'with `rubocop:todo` comments.'],
|
426
|
+
force_exclusion: ['Force excluding files specified in the',
|
427
|
+
'configuration `Exclude` even if they are',
|
428
|
+
'explicitly passed as arguments.'],
|
429
|
+
only_recognized_file_types: ['Inspect files given on the command line only if',
|
430
|
+
'they are listed in AllCops/Include parameters',
|
431
|
+
'of user configuration or default configuration.'],
|
432
|
+
ignore_disable_comments: ['Run cops even when they are disabled locally',
|
433
|
+
'with a comment.'],
|
434
|
+
ignore_parent_exclusion: ['Prevent from inheriting AllCops/Exclude from',
|
435
|
+
'parent folders.'],
|
436
|
+
force_default_config: ['Use default configuration even if configuration',
|
437
|
+
'files are present in the directory tree.'],
|
438
|
+
format: ['Choose an output formatter. This option',
|
439
|
+
'can be specified multiple times to enable',
|
440
|
+
'multiple formatters at the same time.',
|
441
|
+
'[p]rogress is used by default',
|
442
|
+
*FORMATTER_OPTION_LIST.map { |item| " #{item}" },
|
443
|
+
' custom formatter class name'],
|
444
|
+
out: ['Write output to a file instead of STDOUT.',
|
445
|
+
'This option applies to the previously',
|
446
|
+
'specified --format, or the default format',
|
447
|
+
'if no format is specified.'],
|
448
|
+
fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
|
449
|
+
'with error code.'],
|
450
|
+
display_only_failed: ['Only output offense messages. Omit passing',
|
451
|
+
'cops. Only valid for --format junit.'],
|
452
|
+
display_only_fail_level_offenses:
|
453
|
+
['Only output offense messages at',
|
454
|
+
'the specified --fail-level or above'],
|
455
|
+
show_cops: ['Shows the given cops, or all cops by',
|
456
|
+
'default, and their configurations for the',
|
457
|
+
'current directory.'],
|
458
|
+
fail_fast: ['Inspect files in order of modification',
|
459
|
+
'time and stop after the first file',
|
460
|
+
'containing offenses.'],
|
461
|
+
cache: ["Use result caching (FLAG=true) or don't",
|
462
|
+
'(FLAG=false), default determined by',
|
463
|
+
'configuration parameter AllCops: UseCache.'],
|
464
|
+
debug: 'Display debug info.',
|
465
|
+
display_cop_names: ['Display cop names in offense messages.',
|
466
|
+
'Default is true.'],
|
467
|
+
disable_pending_cops: 'Run without pending cops.',
|
468
|
+
display_style_guide: 'Display style guide URLs in offense messages.',
|
469
|
+
enable_pending_cops: 'Run with pending cops.',
|
470
|
+
extra_details: 'Display extra details in offense messages.',
|
471
|
+
lint: 'Run only lint cops.',
|
472
|
+
safe: 'Run only safe cops.',
|
473
|
+
list_target_files: 'List all files RuboCop will inspect.',
|
474
|
+
auto_correct: 'Auto-correct offenses (only when it\'s safe).',
|
475
|
+
safe_auto_correct: '(same, deprecated)',
|
476
|
+
auto_correct_all: 'Auto-correct offenses (safe and unsafe)',
|
477
|
+
fix_layout: 'Run only layout cops, with auto-correct on.',
|
478
|
+
color: 'Force color output on or off.',
|
479
|
+
version: 'Display version.',
|
480
|
+
verbose_version: 'Display verbose version.',
|
481
|
+
parallel: ['Use available CPUs to execute inspection in',
|
482
|
+
'parallel.'],
|
483
|
+
stdin: ['Pipe source from STDIN, using FILE in offense',
|
484
|
+
'reports. This is useful for editor integration.'],
|
485
|
+
init: 'Generate a .rubocop.yml file in the current directory.'
|
486
|
+
}.freeze
|
487
|
+
end
|
488
|
+
end
|