rubocop 0.35.1 → 0.36.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rubocop might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +164 -0
- data/LICENSE.txt +1 -1
- data/README.md +72 -21
- data/bin/rubocop +1 -0
- data/config/default.yml +167 -18
- data/config/disabled.yml +19 -6
- data/config/enabled.yml +159 -14
- data/lib/rubocop.rb +67 -26
- data/lib/rubocop/ast_node.rb +488 -14
- data/lib/rubocop/ast_node/builder.rb +24 -0
- data/lib/rubocop/ast_node/sexp.rb +13 -0
- data/lib/rubocop/cached_data.rb +58 -0
- data/lib/rubocop/cli.rb +47 -10
- data/lib/rubocop/comment_config.rb +9 -2
- data/lib/rubocop/config.rb +99 -31
- data/lib/rubocop/config_loader.rb +23 -14
- data/lib/rubocop/config_store.rb +1 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +2 -1
- data/lib/rubocop/cop/commissioner.rb +3 -5
- data/lib/rubocop/cop/cop.rb +23 -17
- data/lib/rubocop/cop/corrector.rb +25 -0
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/ignored_node.rb +3 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +2 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -3
- data/lib/rubocop/cop/lint/block_alignment.rb +29 -91
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -1
- data/lib/rubocop/cop/lint/condition_position.rb +2 -1
- data/lib/rubocop/cop/lint/debugger.rb +29 -12
- data/lib/rubocop/cop/lint/def_end_alignment.rb +16 -18
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +6 -6
- data/lib/rubocop/cop/lint/duplicate_methods.rb +98 -74
- data/lib/rubocop/cop/lint/duplicated_key.rb +3 -2
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -2
- data/lib/rubocop/cop/lint/else_layout.rb +2 -1
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +2 -1
- data/lib/rubocop/cop/lint/end_alignment.rb +77 -39
- data/lib/rubocop/cop/lint/end_in_method.rb +2 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -1
- data/lib/rubocop/cop/lint/eval.rb +2 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +31 -0
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -30
- data/lib/rubocop/cop/lint/handle_exceptions.rb +2 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +85 -0
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +120 -0
- data/lib/rubocop/cop/lint/invalid_character_literal.rb +3 -1
- data/lib/rubocop/cop/lint/literal_in_condition.rb +6 -9
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +6 -9
- data/lib/rubocop/cop/lint/loop.rb +2 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +19 -3
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +38 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +5 -8
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -6
- data/lib/rubocop/cop/lint/rand_one.rb +36 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +6 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +3 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -1
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -4
- data/lib/rubocop/cop/lint/syntax.rb +9 -5
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +3 -2
- data/lib/rubocop/cop/lint/unneeded_disable.rb +121 -18
- data/lib/rubocop/cop/lint/unreachable_code.rb +5 -4
- data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +56 -29
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -16
- data/lib/rubocop/cop/lint/useless_comparison.rb +3 -2
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +2 -1
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -20
- data/lib/rubocop/cop/lint/void.rb +10 -11
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -2
- data/lib/rubocop/cop/metrics/line_length.rb +35 -13
- data/lib/rubocop/cop/metrics/method_length.rb +2 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -0
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +4 -2
- data/lib/rubocop/cop/mixin/access_modifier_node.rb +3 -10
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -0
- data/lib/rubocop/cop/mixin/array_hash_indentation.rb +80 -0
- data/lib/rubocop/cop/mixin/array_syntax.rb +2 -1
- data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +14 -20
- data/lib/rubocop/cop/mixin/autocorrect_unless_changing_ast.rb +5 -4
- data/lib/rubocop/cop/mixin/check_assignment.rb +20 -15
- data/lib/rubocop/cop/mixin/classish_length.rb +1 -0
- data/lib/rubocop/cop/mixin/code_length.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +17 -15
- data/lib/rubocop/cop/mixin/configurable_max.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_naming.rb +4 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +9 -4
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +24 -16
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -2
- data/lib/rubocop/cop/mixin/hash_node.rb +15 -0
- data/lib/rubocop/cop/mixin/if_node.rb +1 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -0
- data/lib/rubocop/cop/mixin/method_preference.rb +1 -0
- data/lib/rubocop/cop/mixin/min_body_length.rb +1 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +177 -0
- data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -0
- data/lib/rubocop/cop/mixin/on_method_def.rb +6 -5
- data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -0
- data/lib/rubocop/cop/mixin/parentheses.rb +22 -0
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -0
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -1
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -1
- data/lib/rubocop/cop/mixin/space_inside.rb +2 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +6 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -9
- data/lib/rubocop/cop/mixin/string_literals_help.rb +13 -7
- data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +134 -0
- data/lib/rubocop/cop/mixin/unused_argument.rb +1 -0
- data/lib/rubocop/cop/offense.rb +19 -14
- data/lib/rubocop/cop/performance/case_when_splat.rb +8 -8
- data/lib/rubocop/cop/performance/casecmp.rb +54 -0
- data/lib/rubocop/cop/performance/count.rb +10 -9
- data/lib/rubocop/cop/performance/detect.rb +6 -5
- data/lib/rubocop/cop/performance/double_start_end_with.rb +65 -0
- data/lib/rubocop/cop/performance/end_with.rb +55 -0
- data/lib/rubocop/cop/performance/fixed_size.rb +1 -0
- data/lib/rubocop/cop/performance/flat_map.rb +9 -8
- data/lib/rubocop/cop/performance/hash_each.rb +86 -0
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +44 -0
- data/lib/rubocop/cop/performance/range_include.rb +40 -0
- data/lib/rubocop/cop/performance/redundant_block_call.rb +57 -0
- data/lib/rubocop/cop/performance/redundant_match.rb +51 -0
- data/lib/rubocop/cop/performance/redundant_merge.rb +85 -0
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +45 -0
- data/lib/rubocop/cop/performance/reverse_each.rb +3 -2
- data/lib/rubocop/cop/performance/sample.rb +6 -5
- data/lib/rubocop/cop/performance/size.rb +2 -1
- data/lib/rubocop/cop/performance/start_with.rb +58 -0
- data/lib/rubocop/cop/performance/string_replacement.rb +18 -23
- data/lib/rubocop/cop/performance/times_map.rb +49 -0
- data/lib/rubocop/cop/rails/action_filter.rb +4 -3
- data/lib/rubocop/cop/rails/date.rb +5 -4
- data/lib/rubocop/cop/rails/delegate.rb +3 -2
- data/lib/rubocop/cop/rails/find_by.rb +20 -14
- data/lib/rubocop/cop/rails/find_each.rb +23 -2
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
- data/lib/rubocop/cop/rails/output.rb +4 -2
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +3 -2
- data/lib/rubocop/cop/rails/read_write_attribute.rb +5 -7
- data/lib/rubocop/cop/rails/scope_args.rb +3 -2
- data/lib/rubocop/cop/rails/time_zone.rb +14 -10
- data/lib/rubocop/cop/rails/validation.rb +4 -3
- data/lib/rubocop/cop/severity.rb +8 -7
- data/lib/rubocop/cop/style/access_modifier_indentation.rb +5 -4
- data/lib/rubocop/cop/style/accessor_method_name.rb +1 -0
- data/lib/rubocop/cop/style/alias.rb +84 -24
- data/lib/rubocop/cop/style/align_array.rb +2 -1
- data/lib/rubocop/cop/style/align_hash.rb +13 -14
- data/lib/rubocop/cop/style/align_parameters.rb +3 -2
- data/lib/rubocop/cop/style/and_or.rb +9 -7
- data/lib/rubocop/cop/style/array_join.rb +5 -5
- data/lib/rubocop/cop/style/ascii_comments.rb +2 -1
- data/lib/rubocop/cop/style/ascii_identifiers.rb +2 -1
- data/lib/rubocop/cop/style/attr.rb +30 -5
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -1
- data/lib/rubocop/cop/style/begin_block.rb +2 -1
- data/lib/rubocop/cop/style/block_comments.rb +2 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +10 -9
- data/lib/rubocop/cop/style/block_end_newline.rb +3 -2
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +9 -8
- data/lib/rubocop/cop/style/case_equality.rb +2 -1
- data/lib/rubocop/cop/style/case_indentation.rb +2 -1
- data/lib/rubocop/cop/style/character_literal.rb +11 -7
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +2 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +3 -2
- data/lib/rubocop/cop/style/class_check.rb +2 -1
- data/lib/rubocop/cop/style/class_methods.rb +2 -1
- data/lib/rubocop/cop/style/class_vars.rb +2 -1
- data/lib/rubocop/cop/style/closing_parenthesis_indentation.rb +3 -2
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +8 -7
- data/lib/rubocop/cop/style/comment_annotation.rb +3 -2
- data/lib/rubocop/cop/style/comment_indentation.rb +4 -6
- data/lib/rubocop/cop/style/conditional_assignment.rb +362 -0
- data/lib/rubocop/cop/style/constant_name.rb +2 -1
- data/lib/rubocop/cop/style/copyright.rb +7 -6
- data/lib/rubocop/cop/style/def_with_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/deprecated_hash_methods.rb +3 -2
- data/lib/rubocop/cop/style/documentation.rb +7 -11
- data/lib/rubocop/cop/style/dot_position.rb +3 -2
- data/lib/rubocop/cop/style/double_negation.rb +2 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/else_alignment.rb +3 -2
- data/lib/rubocop/cop/style/empty_else.rb +4 -3
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +2 -1
- data/lib/rubocop/cop/style/empty_lines.rb +10 -4
- data/lib/rubocop/cop/style/empty_lines_around_access_modifier.rb +13 -5
- data/lib/rubocop/cop/style/empty_lines_around_block_body.rb +7 -3
- data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +6 -3
- data/lib/rubocop/cop/style/empty_lines_around_method_body.rb +4 -3
- data/lib/rubocop/cop/style/empty_lines_around_module_body.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +20 -5
- data/lib/rubocop/cop/style/encoding.rb +8 -11
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/end_of_line.rb +2 -1
- data/lib/rubocop/cop/style/even_odd.rb +4 -3
- data/lib/rubocop/cop/style/extra_spacing.rb +110 -74
- data/lib/rubocop/cop/style/file_name.rb +103 -6
- data/lib/rubocop/cop/style/first_array_element_line_break.rb +3 -2
- data/lib/rubocop/cop/style/first_hash_element_line_break.rb +5 -6
- data/lib/rubocop/cop/style/first_method_argument_line_break.rb +14 -1
- data/lib/rubocop/cop/style/first_method_parameter_line_break.rb +2 -1
- data/lib/rubocop/cop/style/first_parameter_indentation.rb +6 -4
- data/lib/rubocop/cop/style/flip_flop.rb +2 -1
- data/lib/rubocop/cop/style/for.rb +2 -1
- data/lib/rubocop/cop/style/format_string.rb +1 -0
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -0
- data/lib/rubocop/cop/style/global_vars.rb +2 -1
- data/lib/rubocop/cop/style/guard_clause.rb +63 -11
- data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +93 -0
- data/lib/rubocop/cop/style/if_inside_else.rb +49 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +6 -5
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -1
- data/lib/rubocop/cop/style/indent_array.rb +89 -38
- data/lib/rubocop/cop/style/indent_assignment.rb +43 -0
- data/lib/rubocop/cop/style/indent_hash.rb +16 -77
- data/lib/rubocop/cop/style/indentation_consistency.rb +2 -1
- data/lib/rubocop/cop/style/indentation_width.rb +11 -11
- data/lib/rubocop/cop/style/infinite_loop.rb +5 -9
- data/lib/rubocop/cop/style/initial_indentation.rb +2 -1
- data/lib/rubocop/cop/style/inline_comment.rb +2 -1
- data/lib/rubocop/cop/style/lambda.rb +14 -11
- data/lib/rubocop/cop/style/lambda_call.rb +4 -4
- data/lib/rubocop/cop/style/leading_comment_space.rb +2 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +3 -1
- data/lib/rubocop/cop/style/method_call_parentheses.rb +9 -1
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -4
- data/lib/rubocop/cop/style/method_name.rb +1 -0
- data/lib/rubocop/cop/style/missing_else.rb +5 -3
- data/lib/rubocop/cop/style/module_function.rb +2 -1
- data/lib/rubocop/cop/style/multiline_array_brace_layout.rb +95 -0
- data/lib/rubocop/cop/style/multiline_assignment_layout.rb +91 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_block_layout.rb +11 -9
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -0
- data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +137 -0
- data/lib/rubocop/cop/style/multiline_operation_indentation.rb +25 -135
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +2 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -5
- data/lib/rubocop/cop/style/negated_if.rb +3 -3
- data/lib/rubocop/cop/style/negated_while.rb +3 -3
- data/lib/rubocop/cop/style/nested_modifier.rb +6 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +48 -0
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -1
- data/lib/rubocop/cop/style/next.rb +79 -15
- data/lib/rubocop/cop/style/nil_comparison.rb +5 -5
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
- data/lib/rubocop/cop/style/not.rb +5 -9
- data/lib/rubocop/cop/style/numeric_literals.rb +5 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +3 -2
- data/lib/rubocop/cop/style/op_method.rb +7 -4
- data/lib/rubocop/cop/style/option_hash.rb +13 -7
- data/lib/rubocop/cop/style/optional_arguments.rb +3 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +40 -16
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +3 -16
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +3 -2
- data/lib/rubocop/cop/style/percent_q_literals.rb +3 -6
- data/lib/rubocop/cop/style/perl_backrefs.rb +4 -3
- data/lib/rubocop/cop/style/predicate_name.rb +1 -0
- data/lib/rubocop/cop/style/proc.rb +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +2 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +5 -5
- data/lib/rubocop/cop/style/redundant_freeze.rb +5 -4
- data/lib/rubocop/cop/style/redundant_parentheses.rb +80 -0
- data/lib/rubocop/cop/style/redundant_return.rb +5 -4
- data/lib/rubocop/cop/style/redundant_self.rb +7 -8
- data/lib/rubocop/cop/style/regexp_literal.rb +9 -8
- data/lib/rubocop/cop/style/rescue_ensure_alignment.rb +3 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +11 -9
- data/lib/rubocop/cop/style/self_assignment.rb +4 -5
- data/lib/rubocop/cop/style/semicolon.rb +3 -2
- data/lib/rubocop/cop/style/send.rb +3 -1
- data/lib/rubocop/cop/style/signal_exception.rb +5 -3
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +7 -7
- data/lib/rubocop/cop/style/space_after_colon.rb +2 -1
- data/lib/rubocop/cop/style/space_after_comma.rb +1 -0
- data/lib/rubocop/cop/style/space_after_control_keyword.rb +5 -5
- data/lib/rubocop/cop/style/space_after_method_name.rb +3 -2
- data/lib/rubocop/cop/style/space_after_not.rb +4 -3
- data/lib/rubocop/cop/style/space_after_semicolon.rb +1 -0
- data/lib/rubocop/cop/style/space_around_block_parameters.rb +8 -7
- data/lib/rubocop/cop/style/space_around_equals_in_parameter_default.rb +1 -0
- data/lib/rubocop/cop/style/space_around_operators.rb +72 -32
- data/lib/rubocop/cop/style/space_before_block_braces.rb +2 -1
- data/lib/rubocop/cop/style/space_before_comma.rb +1 -0
- data/lib/rubocop/cop/style/space_before_comment.rb +2 -1
- data/lib/rubocop/cop/style/{single_space_before_first_arg.rb → space_before_first_arg.rb} +13 -4
- data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +4 -3
- data/lib/rubocop/cop/style/space_before_semicolon.rb +1 -0
- data/lib/rubocop/cop/style/space_inside_block_braces.rb +3 -2
- data/lib/rubocop/cop/style/space_inside_brackets.rb +1 -0
- data/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb +4 -1
- data/lib/rubocop/cop/style/space_inside_parens.rb +1 -0
- data/lib/rubocop/cop/style/space_inside_range_literal.rb +5 -4
- data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +8 -17
- data/lib/rubocop/cop/style/special_global_vars.rb +97 -52
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +16 -9
- data/lib/rubocop/cop/style/string_literals.rb +41 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -1
- data/lib/rubocop/cop/style/string_methods.rb +2 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -2
- data/lib/rubocop/cop/style/symbol_array.rb +74 -7
- data/lib/rubocop/cop/style/symbol_literal.rb +4 -7
- data/lib/rubocop/cop/style/symbol_proc.rb +11 -7
- data/lib/rubocop/cop/style/tab.rb +25 -2
- data/lib/rubocop/cop/style/trailing_blank_lines.rb +1 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
- data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +56 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -7
- data/lib/rubocop/cop/style/trailing_whitespace.rb +2 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +18 -9
- data/lib/rubocop/cop/style/unless_else.rb +2 -1
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +4 -3
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +87 -0
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +23 -7
- data/lib/rubocop/cop/style/variable_interpolation.rb +8 -6
- data/lib/rubocop/cop/style/variable_name.rb +1 -0
- data/lib/rubocop/cop/style/when_then.rb +2 -1
- data/lib/rubocop/cop/style/while_until_do.rb +3 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +3 -4
- data/lib/rubocop/cop/style/word_array.rb +74 -51
- data/lib/rubocop/cop/team.rb +21 -15
- data/lib/rubocop/cop/util.rb +102 -69
- data/lib/rubocop/cop/variable_force.rb +2 -1
- data/lib/rubocop/cop/variable_force/assignment.rb +2 -1
- data/lib/rubocop/cop/variable_force/locatable.rb +1 -0
- data/lib/rubocop/cop/variable_force/reference.rb +1 -0
- data/lib/rubocop/cop/variable_force/scope.rb +2 -1
- data/lib/rubocop/cop/variable_force/variable.rb +2 -1
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -1
- data/lib/rubocop/error.rb +12 -0
- data/lib/rubocop/formatter/base_formatter.rb +10 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -0
- data/lib/rubocop/formatter/colorizable.rb +6 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +29 -15
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +3 -1
- data/lib/rubocop/formatter/emacs_style_formatter.rb +7 -3
- data/lib/rubocop/formatter/file_list_formatter.rb +1 -0
- data/lib/rubocop/formatter/formatter_set.rb +10 -19
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +2 -1
- data/lib/rubocop/formatter/html_formatter.rb +15 -14
- data/lib/rubocop/formatter/json_formatter.rb +2 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -0
- data/lib/rubocop/formatter/progress_formatter.rb +3 -3
- data/lib/rubocop/formatter/simple_text_formatter.rb +50 -17
- data/lib/rubocop/formatter/text_util.rb +8 -10
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +61 -0
- data/lib/rubocop/name_similarity.rb +22 -0
- data/lib/rubocop/node_pattern.rb +126 -35
- data/lib/rubocop/options.rb +28 -19
- data/lib/rubocop/path_util.rb +1 -0
- data/lib/rubocop/processed_source.rb +41 -16
- data/lib/rubocop/rake_task.rb +6 -9
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +60 -43
- data/lib/rubocop/runner.rb +48 -45
- data/lib/rubocop/string_util.rb +1 -0
- data/lib/rubocop/target_finder.rb +2 -1
- data/lib/rubocop/token.rb +1 -0
- data/lib/rubocop/version.rb +3 -2
- data/lib/rubocop/warning.rb +1 -0
- data/relnotes/v0.36.0.md +306 -0
- data/rubocop.gemspec +3 -9
- metadata +48 -92
- data/lib/rubocop/cop/lint/space_before_first_arg.rb +0 -44
- data/lib/rubocop/cop/rails/default_scope.rb +0 -33
- data/lib/rubocop/cop/style/trailing_comma.rb +0 -182
data/lib/rubocop/cop/team.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module RuboCop
|
4
5
|
module Cop
|
@@ -6,7 +7,7 @@ module RuboCop
|
|
6
7
|
class Team
|
7
8
|
attr_reader :errors, :warnings, :updated_source_file
|
8
9
|
|
9
|
-
|
10
|
+
alias updated_source_file? updated_source_file
|
10
11
|
|
11
12
|
def initialize(cop_classes, config, options = nil)
|
12
13
|
@cop_classes = cop_classes
|
@@ -14,6 +15,8 @@ module RuboCop
|
|
14
15
|
@options = options || { auto_correct: false, debug: false }
|
15
16
|
@errors = []
|
16
17
|
@warnings = []
|
18
|
+
|
19
|
+
validate_config
|
17
20
|
end
|
18
21
|
|
19
22
|
def autocorrect?
|
@@ -38,9 +41,8 @@ module RuboCop
|
|
38
41
|
end
|
39
42
|
|
40
43
|
def cops
|
41
|
-
@cops ||= @cop_classes.
|
42
|
-
|
43
|
-
instances << cop_class.new(@config, @options)
|
44
|
+
@cops ||= @cop_classes.select { |c| cop_enabled?(c) }.map do |cop_class|
|
45
|
+
cop_class.new(@config, @options)
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
@@ -67,8 +69,13 @@ module RuboCop
|
|
67
69
|
|
68
70
|
return if new_source == buffer.source
|
69
71
|
|
70
|
-
|
71
|
-
|
72
|
+
if @options[:stdin]
|
73
|
+
# holds source read in from stdin, when --stdin option is used
|
74
|
+
@options[:stdin] = new_source
|
75
|
+
else
|
76
|
+
filename = buffer.name
|
77
|
+
File.open(filename, 'wb') { |f| f.write(new_source) }
|
78
|
+
end
|
72
79
|
@updated_source_file = true
|
73
80
|
end
|
74
81
|
|
@@ -76,17 +83,10 @@ module RuboCop
|
|
76
83
|
# re-running of auto-corrections will make sure that the full set of
|
77
84
|
# auto-corrections is tried again after this method has finished.
|
78
85
|
def autocorrect_one_cop(buffer, cops)
|
79
|
-
cop_with_corrections = cops.find
|
80
|
-
|
81
|
-
end
|
86
|
+
cop_with_corrections = cops.find { |cop| cop.corrections.any? }
|
87
|
+
|
82
88
|
if cop_with_corrections
|
83
89
|
corrections = cop_with_corrections.corrections
|
84
|
-
# Be extra careful if there are tabs in the source and just correct
|
85
|
-
# one offense, because inserting or removing space next to a tab has
|
86
|
-
# special implications, and existing ranges can't be used after such
|
87
|
-
# a change.
|
88
|
-
corrections = [corrections.first] if buffer.source =~ /\t/
|
89
|
-
|
90
90
|
corrector = Corrector.new(buffer, corrections)
|
91
91
|
corrector.rewrite
|
92
92
|
else
|
@@ -94,6 +94,12 @@ module RuboCop
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
+
def validate_config
|
98
|
+
cops.each do |cop|
|
99
|
+
cop.validate_config if cop.respond_to?(:validate_config)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
97
103
|
def process_commissioner_errors(file, file_errors)
|
98
104
|
file_errors.each do |cop, errors|
|
99
105
|
errors.each do |e|
|
data/lib/rubocop/cop/util.rb
CHANGED
@@ -1,28 +1,42 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
2
|
+
# frozen_string_literal: true
|
3
3
|
# rubocop:disable Metrics/ModuleLength
|
4
|
+
|
4
5
|
module RuboCop
|
5
6
|
module Cop
|
6
7
|
# This module contains a collection of useful utility methods.
|
7
8
|
module Util
|
8
9
|
include PathUtil
|
9
|
-
extend
|
10
|
-
|
11
|
-
PROC_NEW_NODE = s(:send, s(:const, nil, :Proc), :new)
|
12
|
-
EQUALS_ASGN_NODES = [:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn, :masgn]
|
13
|
-
SHORTHAND_ASGN_NODES = [:op_asgn, :or_asgn, :and_asgn]
|
14
|
-
ASGN_NODES = EQUALS_ASGN_NODES + SHORTHAND_ASGN_NODES
|
10
|
+
extend RuboCop::Sexp
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
EQUALS_ASGN_NODES = [:lvasgn, :ivasgn, :cvasgn, :gvasgn,
|
13
|
+
:casgn, :masgn].freeze
|
14
|
+
SHORTHAND_ASGN_NODES = [:op_asgn, :or_asgn, :and_asgn].freeze
|
15
|
+
ASGN_NODES = (EQUALS_ASGN_NODES + SHORTHAND_ASGN_NODES).freeze
|
19
16
|
|
20
17
|
# http://phrogz.net/programmingruby/language.html#table_18.4
|
21
18
|
# Backtick is added last just to help editors parse this code.
|
22
19
|
OPERATOR_METHODS = %w(
|
23
20
|
| ^ & <=> == === =~ > >= < <= << >>
|
24
21
|
+ - * / % ** ~ +@ -@ [] []= ! != !~
|
25
|
-
).map(&:to_sym)
|
22
|
+
).map(&:to_sym).push(:'`').freeze
|
23
|
+
|
24
|
+
STRING_ESCAPES = {
|
25
|
+
'\a' => "\a", '\b' => "\b", '\e' => "\e", '\f' => "\f", '\n' => "\n",
|
26
|
+
'\r' => "\r", '\s' => ' ', '\t' => "\t", '\v' => "\v", "\\\n" => ''
|
27
|
+
}.freeze
|
28
|
+
STRING_ESCAPE_REGEX = /\\(?:
|
29
|
+
[abefnrstv\n] | # simple escapes (above)
|
30
|
+
\d{1,3} | # octal byte escape
|
31
|
+
x\d{1,2} | # hex byte escape
|
32
|
+
u[0-9a-fA-F]{4} | # unicode char escape
|
33
|
+
u\{[^}]*\} | # extended unicode escape
|
34
|
+
. # any other escaped char
|
35
|
+
)/x
|
36
|
+
|
37
|
+
# Match literal regex characters, not including anchors, character
|
38
|
+
# classes, alternatives, groups, repetitions, references, etc
|
39
|
+
LITERAL_REGEX = /[\w\s\-,"'!#%&<>=;:`~]|\\[^AbBdDgGkwWszZS0-9]/
|
26
40
|
|
27
41
|
module_function
|
28
42
|
|
@@ -33,12 +47,11 @@ module RuboCop
|
|
33
47
|
def strip_quotes(str)
|
34
48
|
if str[0] == '"' || str[0] == "'"
|
35
49
|
str[0] = ''
|
36
|
-
str[-1] = ''
|
37
50
|
else
|
38
51
|
# we're dealing with %q or %Q
|
39
52
|
str[0, 3] = ''
|
40
|
-
str[-1] = ''
|
41
53
|
end
|
54
|
+
str[-1] = ''
|
42
55
|
|
43
56
|
str
|
44
57
|
end
|
@@ -56,7 +69,7 @@ module RuboCop
|
|
56
69
|
when Parser::Source::Range
|
57
70
|
arg
|
58
71
|
when Parser::AST::Node
|
59
|
-
arg.
|
72
|
+
arg.source_range
|
60
73
|
else
|
61
74
|
fail ArgumentError, "Invalid argument #{arg}"
|
62
75
|
end
|
@@ -64,65 +77,20 @@ module RuboCop
|
|
64
77
|
source_range.begin.line..source_range.end.line
|
65
78
|
end
|
66
79
|
|
67
|
-
def const_name(node)
|
68
|
-
return nil if node.nil? || node.type != :const
|
69
|
-
|
70
|
-
const_names = []
|
71
|
-
const_node = node
|
72
|
-
|
73
|
-
loop do
|
74
|
-
namespace_node, name = *const_node
|
75
|
-
const_names << name
|
76
|
-
break unless namespace_node
|
77
|
-
break unless namespace_node.is_a?(Parser::AST::Node)
|
78
|
-
break if namespace_node.type == :cbase
|
79
|
-
const_node = namespace_node
|
80
|
-
end
|
81
|
-
|
82
|
-
const_names.reverse.join('::')
|
83
|
-
end
|
84
|
-
|
85
|
-
def command?(name, node)
|
86
|
-
return unless node.type == :send
|
87
|
-
|
88
|
-
receiver, method_name, _args = *node
|
89
|
-
|
90
|
-
# commands have no explicit receiver
|
91
|
-
!receiver && method_name == name
|
92
|
-
end
|
93
|
-
|
94
|
-
def lambda?(node)
|
95
|
-
fail 'Not a block node' unless node.type == :block
|
96
|
-
|
97
|
-
send_node, _block_args, _block_body = *node
|
98
|
-
|
99
|
-
command?(:lambda, send_node)
|
100
|
-
end
|
101
|
-
|
102
|
-
def proc?(node)
|
103
|
-
fail 'Not a block node' unless node.type == :block
|
104
|
-
|
105
|
-
send_node, _block_args, _block_body = *node
|
106
|
-
|
107
|
-
command?(:proc, send_node) || send_node == PROC_NEW_NODE
|
108
|
-
end
|
109
|
-
|
110
|
-
def lambda_or_proc?(node)
|
111
|
-
lambda?(node) || proc?(node)
|
112
|
-
end
|
113
|
-
|
114
80
|
def parentheses?(node)
|
115
|
-
node.loc.respond_to?(:end) && node.loc.end
|
81
|
+
node.loc.respond_to?(:end) && node.loc.end &&
|
82
|
+
node.loc.end.is?(')'.freeze)
|
116
83
|
end
|
117
84
|
|
118
|
-
def on_node(syms, sexp, excludes = [])
|
119
|
-
|
85
|
+
def on_node(syms, sexp, excludes = [], &block)
|
86
|
+
return to_enum(:on_node, syms, sexp, excludes) unless block_given?
|
120
87
|
|
88
|
+
yield sexp if Array(syms).include?(sexp.type)
|
121
89
|
return if Array(excludes).include?(sexp.type)
|
122
90
|
|
123
91
|
sexp.children.each do |elem|
|
124
92
|
next unless elem.is_a?(Parser::AST::Node)
|
125
|
-
on_node(syms, elem, excludes)
|
93
|
+
on_node(syms, elem, excludes, &block)
|
126
94
|
end
|
127
95
|
end
|
128
96
|
|
@@ -191,13 +159,17 @@ module RuboCop
|
|
191
159
|
end
|
192
160
|
|
193
161
|
def begins_its_line?(range)
|
194
|
-
|
195
|
-
|
162
|
+
(range.source_line =~ /\S/) == range.column
|
163
|
+
end
|
164
|
+
|
165
|
+
def ends_its_line?(range)
|
166
|
+
line = range.source_buffer.source_line(range.last_line)
|
167
|
+
(line =~ /\s*\z/) == range.last_column
|
196
168
|
end
|
197
169
|
|
198
170
|
def within_node?(inner, outer)
|
199
|
-
o = outer.
|
200
|
-
i = inner.
|
171
|
+
o = outer.is_a?(Node) ? outer.source_range : outer
|
172
|
+
i = inner.is_a?(Node) ? inner.source_range : inner
|
201
173
|
i.begin_pos >= o.begin_pos && i.end_pos <= o.end_pos
|
202
174
|
end
|
203
175
|
|
@@ -226,6 +198,67 @@ module RuboCop
|
|
226
198
|
size = 0 if size < 0
|
227
199
|
size
|
228
200
|
end
|
201
|
+
|
202
|
+
# If converting a string to Ruby string literal source code, must
|
203
|
+
# double quotes be used?
|
204
|
+
def double_quotes_required?(string)
|
205
|
+
# Double quotes are required for strings which either:
|
206
|
+
# - Contain single quotes
|
207
|
+
# - Contain non-printable characters, which must use an escape
|
208
|
+
|
209
|
+
# Regex matches IF there is a ' or there is a \\ in the string that is
|
210
|
+
# not preceded/followed by another \\ (e.g. "\\x34") but not "\\\\".
|
211
|
+
string.inspect =~ /'|(?<! \\) \\{2}* \\ (?![\\"])/x
|
212
|
+
end
|
213
|
+
|
214
|
+
# If double quoted string literals are found in Ruby code, and they are
|
215
|
+
# not the preferred style, should they be flagged?
|
216
|
+
def double_quotes_acceptable?(string)
|
217
|
+
# If a string literal contains hard-to-type characters which would
|
218
|
+
# not appear on a "normal" keyboard, then double-quotes are acceptable
|
219
|
+
double_quotes_required?(string) ||
|
220
|
+
string.codepoints.any? { |cp| cp < 32 || cp > 126 }
|
221
|
+
end
|
222
|
+
|
223
|
+
def to_string_literal(string)
|
224
|
+
if double_quotes_required?(string)
|
225
|
+
string.inspect
|
226
|
+
else
|
227
|
+
"'#{string.gsub('\\') { '\\\\' }}'"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def to_symbol_literal(string)
|
232
|
+
if string =~ /\s/ || double_quotes_required?(string)
|
233
|
+
":#{to_string_literal(string)}"
|
234
|
+
else
|
235
|
+
":#{string}"
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
# Take a string with embedded escapes, and convert the escapes as the Ruby
|
240
|
+
# interpreter would when reading a double-quoted string literal.
|
241
|
+
# For example, "\\n" will be converted to "\n".
|
242
|
+
def interpret_string_escapes(string)
|
243
|
+
# We currently don't handle \cx, \C-x, and \M-x
|
244
|
+
string.gsub(STRING_ESCAPE_REGEX) do |escape|
|
245
|
+
STRING_ESCAPES[escape] || begin
|
246
|
+
if escape[1] == 'x'
|
247
|
+
[escape[2..-1].hex].pack('C')
|
248
|
+
elsif escape[1] == 'u'
|
249
|
+
if escape[2] == '{'
|
250
|
+
escape[3..-1].split(/\s+/).map(&:hex).pack('U')
|
251
|
+
else
|
252
|
+
[escape[2..-1].hex].pack('U')
|
253
|
+
end
|
254
|
+
elsif escape[1] =~ /\d/ # octal escape
|
255
|
+
[escape[1..-1].to_i(8)].pack('C')
|
256
|
+
else
|
257
|
+
escape[1] # literal escaped char, like \\
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
229
262
|
end
|
230
263
|
end
|
231
264
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module RuboCop
|
4
5
|
module Cop
|
@@ -59,7 +60,7 @@ module RuboCop
|
|
59
60
|
if root_node.begin_type?
|
60
61
|
root_node
|
61
62
|
else
|
62
|
-
|
63
|
+
Node.new(:begin, [root_node])
|
63
64
|
end
|
64
65
|
end
|
65
66
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module RuboCop
|
4
5
|
module Cop
|
@@ -11,7 +12,7 @@ module RuboCop
|
|
11
12
|
REFERENCE_PENETRABLE_BRANCH_TYPES = %w(rescue_main ensure_main).freeze
|
12
13
|
|
13
14
|
attr_reader :node, :variable, :referenced
|
14
|
-
|
15
|
+
alias referenced? referenced
|
15
16
|
|
16
17
|
def initialize(node, variable)
|
17
18
|
unless VARIABLE_ASSIGNMENT_TYPES.include?(node.type)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module RuboCop
|
4
5
|
module Cop
|
@@ -12,7 +13,7 @@ module RuboCop
|
|
12
13
|
|
13
14
|
attr_reader :name, :declaration_node, :scope,
|
14
15
|
:assignments, :references, :captured_by_block
|
15
|
-
|
16
|
+
alias captured_by_block? captured_by_block
|
16
17
|
|
17
18
|
def initialize(name, declaration_node, scope)
|
18
19
|
unless VARIABLE_DECLARATION_TYPES.include?(declaration_node.type)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module RuboCop
|
4
5
|
module Cop
|
@@ -58,7 +59,7 @@ module RuboCop
|
|
58
59
|
|
59
60
|
unless variable
|
60
61
|
fail "Assigning to undeclared local variable \"#{name}\" " \
|
61
|
-
"at #{node.
|
62
|
+
"at #{node.source_range}, #{node.inspect}"
|
62
63
|
end
|
63
64
|
|
64
65
|
variable.assign(node)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module RuboCop
|
5
|
+
# An Error exception is different from an Offense with severity 'error'
|
6
|
+
# When this exception is raised, it means that RuboCop is unable to perform
|
7
|
+
# a requested action (probably due to misconfiguration) and must stop
|
8
|
+
# immediately, rather than carrying on
|
9
|
+
class Error < StandardError; end
|
10
|
+
|
11
|
+
class ValidationError < Error; end
|
12
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
# rubocop:disable Metrics/LineLength
|
4
5
|
|
@@ -53,12 +54,20 @@ module RuboCop
|
|
53
54
|
# @see #initialize
|
54
55
|
attr_reader :output
|
55
56
|
|
57
|
+
# @api public
|
58
|
+
#
|
59
|
+
# @!attribute [r] options
|
60
|
+
#
|
61
|
+
# @return [Hash]
|
62
|
+
attr_reader :options
|
63
|
+
|
56
64
|
# @api public
|
57
65
|
#
|
58
66
|
# @param output [IO]
|
59
67
|
# `$stdout` or opened file
|
60
|
-
def initialize(output)
|
68
|
+
def initialize(output, options = {})
|
61
69
|
@output = output
|
70
|
+
@options = options
|
62
71
|
end
|
63
72
|
|
64
73
|
# @api public
|