rubocop 0.83.0 → 0.87.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +26 -18
- data/config/default.yml +128 -23
- data/lib/rubocop.rb +21 -59
- data/lib/rubocop/ast_aliases.rb +8 -0
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +2 -6
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +24 -70
- data/lib/rubocop/config_loader_resolver.rb +21 -9
- data/lib/rubocop/config_obsoletion.rb +0 -1
- data/lib/rubocop/config_store.rb +12 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -25
- data/lib/rubocop/cop/base.rb +399 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +48 -71
- data/lib/rubocop/cop/cop.rb +91 -227
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -6
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +2 -2
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/ignored_node.rb +1 -3
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/layout/case_indentation.rb +21 -22
- data/lib/rubocop/cop/layout/class_structure.rb +19 -16
- data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +57 -4
- data/lib/rubocop/cop/layout/end_of_line.rb +3 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -4
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -3
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -9
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -7
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +20 -103
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
- data/lib/rubocop/cop/layout/line_length.rb +17 -17
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +19 -25
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +2 -4
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
- 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_operator.rb +5 -2
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
- data/lib/rubocop/cop/lint/loop.rb +1 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -5
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +9 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +15 -2
- data/lib/rubocop/cop/lint/syntax.rb +11 -28
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +22 -0
- data/lib/rubocop/cop/metrics/class_length.rb +25 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
- data/lib/rubocop/cop/metrics/method_length.rb +23 -0
- data/lib/rubocop/cop/metrics/module_length.rb +25 -2
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- 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 +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +1 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
- data/lib/rubocop/cop/mixin/code_length.rb +4 -0
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -5
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +1 -1
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +10 -5
- data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
- data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -5
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
- data/lib/rubocop/cop/naming/file_name.rb +28 -17
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +4 -6
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/registry.rb +63 -10
- data/lib/rubocop/cop/severity.rb +1 -3
- data/lib/rubocop/cop/style/accessor_grouping.rb +136 -0
- data/lib/rubocop/cop/style/and_or.rb +2 -2
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +121 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +4 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +21 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -4
- data/lib/rubocop/cop/style/copyright.rb +5 -5
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +2 -2
- data/lib/rubocop/cop/style/double_negation.rb +41 -4
- data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
- data/lib/rubocop/cop/style/empty_literal.rb +6 -8
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -5
- data/lib/rubocop/cop/style/format_string_token.rb +2 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
- data/lib/rubocop/cop/style/hash_each_methods.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +16 -7
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
- data/lib/rubocop/cop/style/negated_if.rb +3 -3
- data/lib/rubocop/cop/style/negated_unless.rb +3 -3
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/one_line_conditional.rb +2 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +10 -8
- data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
- 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_self.rb +6 -9
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -6
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +5 -5
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +3 -3
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +13 -13
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/when_then.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
- data/lib/rubocop/cop/team.rb +141 -81
- data/lib/rubocop/cop/util.rb +3 -3
- data/lib/rubocop/cop/utils/format_string.rb +19 -2
- data/lib/rubocop/cop/variable_force.rb +3 -9
- data/lib/rubocop/cop/variable_force/branch.rb +1 -3
- data/lib/rubocop/cop/variable_force/variable.rb +2 -6
- data/lib/rubocop/ext/processed_source.rb +18 -0
- data/lib/rubocop/formatter/base_formatter.rb +0 -4
- data/lib/rubocop/formatter/disabled_config_formatter.rb +5 -13
- data/lib/rubocop/formatter/formatter_set.rb +2 -4
- data/lib/rubocop/formatter/junit_formatter.rb +14 -4
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +30 -15
- data/lib/rubocop/path_util.rb +2 -2
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +6 -9
- data/lib/rubocop/remote_config.rb +1 -3
- data/lib/rubocop/result_cache.rb +5 -7
- data/lib/rubocop/rspec/cop_helper.rb +5 -28
- data/lib/rubocop/rspec/expect_offense.rb +60 -23
- data/lib/rubocop/rspec/shared_contexts.rb +55 -17
- data/lib/rubocop/runner.rb +42 -38
- data/lib/rubocop/target_finder.rb +2 -4
- data/lib/rubocop/target_ruby.rb +5 -2
- data/lib/rubocop/version.rb +5 -3
- metadata +60 -62
- data/lib/rubocop/ast/builder.rb +0 -85
- data/lib/rubocop/ast/node.rb +0 -637
- data/lib/rubocop/ast/node/alias_node.rb +0 -24
- data/lib/rubocop/ast/node/and_node.rb +0 -29
- data/lib/rubocop/ast/node/args_node.rb +0 -29
- data/lib/rubocop/ast/node/array_node.rb +0 -70
- data/lib/rubocop/ast/node/block_node.rb +0 -121
- data/lib/rubocop/ast/node/break_node.rb +0 -17
- data/lib/rubocop/ast/node/case_match_node.rb +0 -56
- data/lib/rubocop/ast/node/case_node.rb +0 -56
- data/lib/rubocop/ast/node/class_node.rb +0 -31
- data/lib/rubocop/ast/node/def_node.rb +0 -82
- data/lib/rubocop/ast/node/defined_node.rb +0 -17
- data/lib/rubocop/ast/node/ensure_node.rb +0 -17
- data/lib/rubocop/ast/node/float_node.rb +0 -12
- data/lib/rubocop/ast/node/for_node.rb +0 -53
- data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
- data/lib/rubocop/ast/node/hash_node.rb +0 -109
- data/lib/rubocop/ast/node/if_node.rb +0 -175
- data/lib/rubocop/ast/node/int_node.rb +0 -12
- data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
- data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
- data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
- data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
- data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
- data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -269
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
- data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
- data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
- data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
- data/lib/rubocop/ast/node/module_node.rb +0 -24
- data/lib/rubocop/ast/node/or_node.rb +0 -29
- data/lib/rubocop/ast/node/pair_node.rb +0 -63
- data/lib/rubocop/ast/node/range_node.rb +0 -18
- data/lib/rubocop/ast/node/regexp_node.rb +0 -33
- data/lib/rubocop/ast/node/resbody_node.rb +0 -24
- data/lib/rubocop/ast/node/retry_node.rb +0 -17
- data/lib/rubocop/ast/node/return_node.rb +0 -24
- data/lib/rubocop/ast/node/self_class_node.rb +0 -24
- data/lib/rubocop/ast/node/send_node.rb +0 -17
- data/lib/rubocop/ast/node/str_node.rb +0 -16
- data/lib/rubocop/ast/node/super_node.rb +0 -21
- data/lib/rubocop/ast/node/symbol_node.rb +0 -12
- data/lib/rubocop/ast/node/until_node.rb +0 -35
- data/lib/rubocop/ast/node/when_node.rb +0 -53
- data/lib/rubocop/ast/node/while_node.rb +0 -35
- data/lib/rubocop/ast/node/yield_node.rb +0 -21
- data/lib/rubocop/ast/sexp.rb +0 -16
- data/lib/rubocop/ast/traversal.rb +0 -202
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
- data/lib/rubocop/node_pattern.rb +0 -887
- data/lib/rubocop/processed_source.rb +0 -213
- data/lib/rubocop/token.rb +0 -114
@@ -7,7 +7,7 @@ module RuboCop
|
|
7
7
|
# `||` instead. It can be configured to check only in conditions or in
|
8
8
|
# all contexts.
|
9
9
|
#
|
10
|
-
# @example EnforcedStyle: always
|
10
|
+
# @example EnforcedStyle: always
|
11
11
|
# # bad
|
12
12
|
# foo.save and return
|
13
13
|
#
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
# if foo && bar
|
23
23
|
# end
|
24
24
|
#
|
25
|
-
# @example EnforcedStyle: conditionals
|
25
|
+
# @example EnforcedStyle: conditionals (default)
|
26
26
|
# # bad
|
27
27
|
# if foo and bar
|
28
28
|
# end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# This cop checks for uses of "
|
6
|
+
# This cop checks for uses of "*" as a substitute for _join_.
|
7
7
|
#
|
8
8
|
# Not all cases can reliably checked, due to Ruby's dynamic
|
9
9
|
# types, so we consider only cases when the first argument is an
|
@@ -35,9 +35,7 @@ module RuboCop
|
|
35
35
|
node_expr = node.source_range
|
36
36
|
attr_expr = attr_name.source_range
|
37
37
|
|
38
|
-
if setter&.boolean_type?
|
39
|
-
remove = range_between(attr_expr.end_pos, node_expr.end_pos)
|
40
|
-
end
|
38
|
+
remove = range_between(attr_expr.end_pos, node_expr.end_pos) if setter&.boolean_type?
|
41
39
|
|
42
40
|
lambda do |corrector|
|
43
41
|
corrector.replace(node.loc.selector, replacement_method(node))
|
@@ -60,11 +60,11 @@ module RuboCop
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def requires_percent_q?(source)
|
63
|
-
style == :percent_q &&
|
63
|
+
style == :percent_q && /^%[^\w]/.match?(source)
|
64
64
|
end
|
65
65
|
|
66
66
|
def requires_bare_percent?(source)
|
67
|
-
style == :bare_percent && source
|
67
|
+
style == :bare_percent && source.start_with?('%Q')
|
68
68
|
end
|
69
69
|
|
70
70
|
def add_offense_for_wrong_style(node, good, bad)
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
module RuboCop
|
6
|
+
module Cop
|
7
|
+
module Style
|
8
|
+
# This cop checks for places where `attr_reader` and `attr_writer`
|
9
|
+
# for the same method can be combined into single `attr_accessor`.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# # bad
|
13
|
+
# class Foo
|
14
|
+
# attr_reader :bar
|
15
|
+
# attr_writer :bar
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# class Foo
|
20
|
+
# attr_accessor :bar
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
class BisectedAttrAccessor < Cop
|
24
|
+
MSG = 'Combine both accessors into `attr_accessor :%<name>s`.'
|
25
|
+
|
26
|
+
def on_class(class_node)
|
27
|
+
reader_names, writer_names = accessor_names(class_node)
|
28
|
+
|
29
|
+
accessor_macroses(class_node).each do |macro|
|
30
|
+
check(macro, reader_names, writer_names)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
alias on_module on_class
|
34
|
+
|
35
|
+
def autocorrect(node)
|
36
|
+
macro = node.parent
|
37
|
+
|
38
|
+
lambda do |corrector|
|
39
|
+
corrector.replace(macro, replacement(macro, node))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def accessor_names(class_node)
|
46
|
+
reader_names = Set.new
|
47
|
+
writer_names = Set.new
|
48
|
+
|
49
|
+
accessor_macroses(class_node).each do |macro|
|
50
|
+
names = macro.arguments.map(&:value)
|
51
|
+
|
52
|
+
names.each do |name|
|
53
|
+
if attr_reader?(macro)
|
54
|
+
reader_names.add(name)
|
55
|
+
else
|
56
|
+
writer_names.add(name)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
[reader_names, writer_names]
|
62
|
+
end
|
63
|
+
|
64
|
+
def accessor_macroses(class_node)
|
65
|
+
class_def = class_node.body
|
66
|
+
return [] if !class_def || class_def.def_type?
|
67
|
+
|
68
|
+
send_nodes =
|
69
|
+
if class_def.send_type?
|
70
|
+
[class_def]
|
71
|
+
else
|
72
|
+
class_def.each_child_node(:send)
|
73
|
+
end
|
74
|
+
|
75
|
+
send_nodes.select { |node| node.macro? && (attr_reader?(node) || attr_writer?(node)) }
|
76
|
+
end
|
77
|
+
|
78
|
+
def attr_reader?(send_node)
|
79
|
+
send_node.method?(:attr_reader) || send_node.method?(:attr)
|
80
|
+
end
|
81
|
+
|
82
|
+
def attr_writer?(send_node)
|
83
|
+
send_node.method?(:attr_writer)
|
84
|
+
end
|
85
|
+
|
86
|
+
def check(macro, reader_names, writer_names)
|
87
|
+
macro.arguments.each do |arg_node|
|
88
|
+
name = arg_node.value
|
89
|
+
|
90
|
+
if (attr_reader?(macro) && writer_names.include?(name)) ||
|
91
|
+
(attr_writer?(macro) && reader_names.include?(name))
|
92
|
+
add_offense(arg_node, message: format(MSG, name: name))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def replacement(macro, node)
|
98
|
+
rest_args = macro.arguments
|
99
|
+
rest_args.delete(node)
|
100
|
+
args = rest_args.map(&:source).join(', ')
|
101
|
+
|
102
|
+
if attr_reader?(macro)
|
103
|
+
if args.empty?
|
104
|
+
"attr_accessor #{node.source}"
|
105
|
+
else
|
106
|
+
"attr_accessor #{node.source}\n#{indent(macro)}#{macro.method_name} #{args}"
|
107
|
+
end
|
108
|
+
elsif args.empty?
|
109
|
+
''
|
110
|
+
else
|
111
|
+
"#{indent(macro)}#{macro.method_name} #{args}"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def indent(node)
|
116
|
+
' ' * node.loc.column
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Metrics/ClassLength
|
4
3
|
module RuboCop
|
5
4
|
module Cop
|
6
5
|
module Style
|
@@ -210,9 +209,7 @@ module RuboCop
|
|
210
209
|
end
|
211
210
|
|
212
211
|
def message(node)
|
213
|
-
if braces_required_method?(node.method_name)
|
214
|
-
return braces_required_message(node)
|
215
|
-
end
|
212
|
+
return braces_required_message(node) if braces_required_method?(node.method_name)
|
216
213
|
|
217
214
|
case style
|
218
215
|
when :line_count_based then line_count_based_message(node)
|
@@ -248,14 +245,13 @@ module RuboCop
|
|
248
245
|
end
|
249
246
|
|
250
247
|
def whitespace_before?(range)
|
251
|
-
range.source_buffer.source[range.begin_pos - 1, 1]
|
248
|
+
/\s/.match?(range.source_buffer.source[range.begin_pos - 1, 1])
|
252
249
|
end
|
253
250
|
|
254
251
|
def whitespace_after?(range, length = 1)
|
255
|
-
range.source_buffer.source[range.begin_pos + length, 1]
|
252
|
+
/\s/.match?(range.source_buffer.source[range.begin_pos + length, 1])
|
256
253
|
end
|
257
254
|
|
258
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
259
255
|
def get_blocks(node, &block)
|
260
256
|
case node.type
|
261
257
|
when :block
|
@@ -273,12 +269,9 @@ module RuboCop
|
|
273
269
|
node.each_child_node { |child| get_blocks(child, &block) }
|
274
270
|
end
|
275
271
|
end
|
276
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
277
272
|
|
278
273
|
def proper_block_style?(node)
|
279
|
-
if special_method?(node.method_name)
|
280
|
-
return special_method_proper_block_style?(node)
|
281
|
-
end
|
274
|
+
return special_method_proper_block_style?(node) if special_method?(node.method_name)
|
282
275
|
|
283
276
|
case style
|
284
277
|
when :line_count_based then line_count_based_block_style?(node)
|
@@ -387,4 +380,3 @@ module RuboCop
|
|
387
380
|
end
|
388
381
|
end
|
389
382
|
end
|
390
|
-
# rubocop:enable Metrics/ClassLength
|
@@ -19,6 +19,15 @@ module RuboCop
|
|
19
19
|
# @@test = 10
|
20
20
|
# end
|
21
21
|
#
|
22
|
+
# class A
|
23
|
+
# def self.test(name, value)
|
24
|
+
# class_variable_set("@@#{name}", value)
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# class A; end
|
29
|
+
# A.class_variable_set(:@@test, 10)
|
30
|
+
#
|
22
31
|
# # good
|
23
32
|
# class A
|
24
33
|
# @test = 10
|
@@ -30,6 +39,12 @@ module RuboCop
|
|
30
39
|
# end
|
31
40
|
# end
|
32
41
|
#
|
42
|
+
# class A
|
43
|
+
# def self.test(name)
|
44
|
+
# class_variable_get("@@#{name}") # you can access without offense
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
#
|
33
48
|
class ClassVars < Cop
|
34
49
|
MSG = 'Replace class var %<class_var>s with a class ' \
|
35
50
|
'instance var.'
|
@@ -38,6 +53,12 @@ module RuboCop
|
|
38
53
|
add_offense(node, location: :name)
|
39
54
|
end
|
40
55
|
|
56
|
+
def on_send(node)
|
57
|
+
return unless node.method?(:class_variable_set)
|
58
|
+
|
59
|
+
add_offense(node.first_argument)
|
60
|
+
end
|
61
|
+
|
41
62
|
def message(node)
|
42
63
|
class_var, = *node
|
43
64
|
format(MSG, class_var: class_var)
|
@@ -55,8 +55,8 @@ module RuboCop
|
|
55
55
|
|
56
56
|
def offensive?(comment)
|
57
57
|
line = line(comment)
|
58
|
-
KEYWORDS.any? { |word|
|
59
|
-
ALLOWED_COMMENTS.none? { |c|
|
58
|
+
KEYWORDS.any? { |word| /^\s*#{word}\s/.match?(line) } &&
|
59
|
+
ALLOWED_COMMENTS.none? { |c| /#\s*#{c}/.match?(line) }
|
60
60
|
end
|
61
61
|
|
62
62
|
def message(comment)
|
@@ -67,7 +67,7 @@ module RuboCop
|
|
67
67
|
|
68
68
|
private
|
69
69
|
|
70
|
-
def expand_elsif(node, elsif_branches = [])
|
70
|
+
def expand_elsif(node, elsif_branches = []) # rubocop:todo Metrics/CyclomaticComplexity
|
71
71
|
return [] if node.nil? || !node.if_type? || !node.elsif?
|
72
72
|
|
73
73
|
elsif_branches << node.if_branch
|
@@ -312,9 +312,7 @@ module RuboCop
|
|
312
312
|
# ignore pseudo-assignments without rhs in for nodes
|
313
313
|
return if node.parent&.for_type?
|
314
314
|
|
315
|
-
if assignment.begin_type? && assignment.children.one?
|
316
|
-
assignment, = *assignment
|
317
|
-
end
|
315
|
+
assignment, = *assignment if assignment.begin_type? && assignment.children.one?
|
318
316
|
|
319
317
|
assignment
|
320
318
|
end
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
8
8
|
# The default regexp for an acceptable copyright notice can be found in
|
9
9
|
# config/default.yml. The default can be changed as follows:
|
10
10
|
#
|
11
|
-
#
|
12
|
-
#
|
11
|
+
# Style/Copyright:
|
12
|
+
# Notice: '^Copyright (\(c\) )?2\d{3} Acme Inc'
|
13
13
|
#
|
14
14
|
# This regex string is treated as an unanchored regex. For each file
|
15
15
|
# that RuboCop scans, a comment that matches this regex must be found or
|
@@ -72,14 +72,14 @@ module RuboCop
|
|
72
72
|
return false if token_index >= processed_source.tokens.size
|
73
73
|
|
74
74
|
token = processed_source.tokens[token_index]
|
75
|
-
token.comment? && token.text
|
75
|
+
token.comment? && /^#!.*$/.match?(token.text)
|
76
76
|
end
|
77
77
|
|
78
78
|
def encoding_token?(processed_source, token_index)
|
79
79
|
return false if token_index >= processed_source.tokens.size
|
80
80
|
|
81
81
|
token = processed_source.tokens[token_index]
|
82
|
-
token.comment? &&
|
82
|
+
token.comment? && /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/.match?(token.text)
|
83
83
|
end
|
84
84
|
|
85
85
|
def notice_found?(processed_source)
|
@@ -88,7 +88,7 @@ module RuboCop
|
|
88
88
|
processed_source.each_token do |token|
|
89
89
|
break unless token.comment?
|
90
90
|
|
91
|
-
notice_found =
|
91
|
+
notice_found = notice_regexp.match?(token.text)
|
92
92
|
break if notice_found
|
93
93
|
end
|
94
94
|
notice_found
|
@@ -21,8 +21,8 @@ module RuboCop
|
|
21
21
|
"file's directory."
|
22
22
|
|
23
23
|
def_node_matcher :dir_replacement?, <<~PATTERN
|
24
|
-
{(send (const nil? :File) :expand_path (send (const nil? :File) :dirname #file_keyword?))
|
25
|
-
(send (const nil? :File) :dirname (send (const nil? :File) :realpath #file_keyword?))}
|
24
|
+
{(send (const {nil? cbase} :File) :expand_path (send (const {nil? cbase} :File) :dirname #file_keyword?))
|
25
|
+
(send (const {nil? cbase} :File) :dirname (send (const {nil? cbase} :File) :realpath #file_keyword?))}
|
26
26
|
PATTERN
|
27
27
|
|
28
28
|
def on_send(node)
|
@@ -104,7 +104,7 @@ module RuboCop
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def compact_namespace?(node)
|
107
|
-
node.loc.name.source
|
107
|
+
/::/.match?(node.loc.name.source)
|
108
108
|
end
|
109
109
|
|
110
110
|
# First checks if the :nodoc: comment is associated with the
|
@@ -123,7 +123,7 @@ module RuboCop
|
|
123
123
|
end
|
124
124
|
|
125
125
|
def nodoc?(comment, require_all = false)
|
126
|
-
|
126
|
+
/^#\s*:nodoc:#{"\s+all\s*$" if require_all}/.match?(comment.text)
|
127
127
|
end
|
128
128
|
|
129
129
|
def nodoc(node)
|
@@ -3,32 +3,69 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# This cop checks for uses of double negation (
|
7
|
-
# to a boolean value. As this is both cryptic and usually redundant, it
|
8
|
-
# should be avoided.
|
6
|
+
# This cop checks for uses of double negation (`!!`) to convert something to a boolean value.
|
9
7
|
#
|
10
|
-
#
|
8
|
+
# When using `EnforcedStyle: allowed_in_returns`, allow double nagation in contexts
|
9
|
+
# that use boolean as a return value. When using `EnforcedStyle: forbidden`, double nagation
|
10
|
+
# should be forbidden always.
|
11
11
|
#
|
12
|
+
# @example
|
12
13
|
# # bad
|
13
14
|
# !!something
|
14
15
|
#
|
15
16
|
# # good
|
16
17
|
# !something.nil?
|
17
18
|
#
|
19
|
+
# @example EnforcedStyle: allowed_in_returns (default)
|
20
|
+
# # good
|
21
|
+
# def foo?
|
22
|
+
# !!return_value
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# @example EnforcedStyle: forbidden
|
26
|
+
# # bad
|
27
|
+
# def foo?
|
28
|
+
# !!return_value
|
29
|
+
# end
|
30
|
+
#
|
18
31
|
# Please, note that when something is a boolean value
|
19
32
|
# !!something and !something.nil? are not the same thing.
|
20
33
|
# As you're unlikely to write code that can accept values of any type
|
21
34
|
# this is rarely a problem in practice.
|
22
35
|
class DoubleNegation < Cop
|
36
|
+
include ConfigurableEnforcedStyle
|
37
|
+
|
23
38
|
MSG = 'Avoid the use of double negation (`!!`).'
|
24
39
|
|
25
40
|
def_node_matcher :double_negative?, '(send (send _ :!) :!)'
|
26
41
|
|
27
42
|
def on_send(node)
|
28
43
|
return unless double_negative?(node) && node.prefix_bang?
|
44
|
+
return if style == :allowed_in_returns && allowed_in_returns?(node)
|
29
45
|
|
30
46
|
add_offense(node, location: :selector)
|
31
47
|
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def allowed_in_returns?(node)
|
52
|
+
node.parent&.return_type? || end_of_method_definition?(node)
|
53
|
+
end
|
54
|
+
|
55
|
+
def end_of_method_definition?(node)
|
56
|
+
return false unless (def_node = find_def_node_from_ascendant(node))
|
57
|
+
|
58
|
+
last_child = def_node.child_nodes.last
|
59
|
+
|
60
|
+
last_child.last_line == node.last_line
|
61
|
+
end
|
62
|
+
|
63
|
+
def find_def_node_from_ascendant(node)
|
64
|
+
return unless (parent = node.parent)
|
65
|
+
return parent if parent.def_type? || parent.defs_type?
|
66
|
+
|
67
|
+
find_def_node_from_ascendant(node.parent)
|
68
|
+
end
|
32
69
|
end
|
33
70
|
end
|
34
71
|
end
|