rubocop 0.80.0 → 0.84.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 +4 -4
- data/config/default.yml +171 -34
- data/lib/rubocop.rb +15 -62
- data/lib/rubocop/ast_aliases.rb +8 -0
- data/lib/rubocop/cli.rb +11 -5
- data/lib/rubocop/cli/command/show_cops.rb +2 -6
- data/lib/rubocop/config.rb +41 -13
- data/lib/rubocop/config_loader.rb +40 -36
- data/lib/rubocop/config_loader_resolver.rb +27 -4
- data/lib/rubocop/config_obsoletion.rb +2 -0
- data/lib/rubocop/config_validator.rb +18 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
- data/lib/rubocop/cop/badge.rb +5 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/corrector.rb +49 -27
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
- data/lib/rubocop/cop/generator.rb +4 -3
- data/lib/rubocop/cop/ignored_node.rb +1 -3
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
- data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
- data/lib/rubocop/cop/layout/condition_position.rb +12 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +0 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -8
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +7 -4
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -4
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +129 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -6
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +40 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +133 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
- data/lib/rubocop/cop/lint/empty_when.rb +29 -6
- data/lib/rubocop/cop/lint/ensure_return.rb +18 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/loop.rb +6 -4
- data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +31 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +20 -25
- data/lib/rubocop/cop/lint/syntax.rb +1 -3
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
- data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
- data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +5 -0
- data/lib/rubocop/cop/migration/department_name.rb +21 -12
- data/lib/rubocop/cop/mixin/alignment.rb +1 -3
- data/lib/rubocop/cop/mixin/array_min_size.rb +2 -6
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -12
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -3
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -3
- data/lib/rubocop/cop/mixin/line_length_help.rb +2 -1
- data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -3
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
- data/lib/rubocop/cop/mixin/surrounding_space.rb +1 -3
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -1
- data/lib/rubocop/cop/naming/file_name.rb +1 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +26 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +13 -10
- data/lib/rubocop/cop/severity.rb +1 -3
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
- data/lib/rubocop/cop/style/alias.rb +4 -4
- data/lib/rubocop/cop/style/and_or.rb +7 -8
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -3
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
- data/lib/rubocop/cop/style/case_equality.rb +24 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +9 -11
- data/lib/rubocop/cop/style/copyright.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
- data/lib/rubocop/cop/style/documentation.rb +43 -5
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +41 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +3 -3
- data/lib/rubocop/cop/style/empty_literal.rb +1 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -5
- data/lib/rubocop/cop/style/end_block.rb +6 -0
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
- data/lib/rubocop/cop/style/format_string.rb +2 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -4
- data/lib/rubocop/cop/style/guard_clause.rb +25 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -3
- data/lib/rubocop/cop/style/hash_syntax.rb +15 -10
- data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +6 -5
- data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
- data/lib/rubocop/cop/style/lambda.rb +3 -2
- data/lib/rubocop/cop/style/lambda_call.rb +1 -21
- 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/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +58 -12
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +6 -9
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +5 -7
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +3 -7
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -7
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -0
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -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 +44 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +2 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +0 -4
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/util.rb +24 -0
- data/lib/rubocop/cop/variable_force.rb +3 -9
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
- data/lib/rubocop/cop/variable_force/branch.rb +2 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +3 -6
- data/lib/rubocop/ext/processed_source.rb +18 -0
- data/lib/rubocop/formatter/base_formatter.rb +0 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
- data/lib/rubocop/formatter/formatter_set.rb +1 -4
- data/lib/rubocop/formatter/junit_formatter.rb +17 -6
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/name_similarity.rb +12 -9
- data/lib/rubocop/options.rb +20 -13
- data/lib/rubocop/remote_config.rb +1 -3
- data/lib/rubocop/result_cache.rb +1 -3
- data/lib/rubocop/rspec/cop_helper.rb +2 -4
- data/lib/rubocop/rspec/expect_offense.rb +4 -10
- data/lib/rubocop/rspec/shared_contexts.rb +54 -20
- data/lib/rubocop/runner.rb +15 -12
- data/lib/rubocop/target_finder.rb +5 -7
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +5 -3
- metadata +32 -77
- data/lib/rubocop/ast/builder.rb +0 -83
- data/lib/rubocop/ast/node.rb +0 -632
- 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 -57
- data/lib/rubocop/ast/node/block_node.rb +0 -117
- data/lib/rubocop/ast/node/break_node.rb +0 -17
- 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 -261
- 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 -13
- 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 -200
- data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
- data/lib/rubocop/node_pattern.rb +0 -887
- data/lib/rubocop/processed_source.rb +0 -216
- data/lib/rubocop/string_util.rb +0 -14
- data/lib/rubocop/token.rb +0 -114
@@ -68,9 +68,7 @@ module RuboCop
|
|
68
68
|
gem_name(current),
|
69
69
|
gem_name(previous)
|
70
70
|
)
|
71
|
-
unless get_dependency_name(previous) == get_dependency_name(current)
|
72
|
-
next
|
73
|
-
end
|
71
|
+
next unless get_dependency_name(previous) == get_dependency_name(current)
|
74
72
|
|
75
73
|
register_offense(previous, current)
|
76
74
|
end
|
@@ -58,7 +58,7 @@ module RuboCop
|
|
58
58
|
# TODO: Implement the cop in here.
|
59
59
|
#
|
60
60
|
# In many cases, you can use a node matcher for matching node pattern.
|
61
|
-
# See https://github.com/rubocop-hq/rubocop/blob/master/lib/rubocop/node_pattern.rb
|
61
|
+
# See https://github.com/rubocop-hq/rubocop-ast/blob/master/lib/rubocop/node_pattern.rb
|
62
62
|
#
|
63
63
|
# For example
|
64
64
|
MSG = 'Use `#good_method` instead of `#bad_method`.'
|
@@ -132,11 +132,12 @@ module RuboCop
|
|
132
132
|
).inject
|
133
133
|
end
|
134
134
|
|
135
|
-
def inject_config(config_file_path: 'config/default.yml'
|
135
|
+
def inject_config(config_file_path: 'config/default.yml',
|
136
|
+
version_added: bump_minor_version)
|
136
137
|
injector =
|
137
138
|
ConfigurationInjector.new(configuration_file_path: config_file_path,
|
138
139
|
badge: badge,
|
139
|
-
version_added:
|
140
|
+
version_added: version_added)
|
140
141
|
|
141
142
|
injector.inject do
|
142
143
|
output.puts(format(CONFIGURATION_ADDED_MESSAGE,
|
@@ -10,9 +10,7 @@ module RuboCop
|
|
10
10
|
|
11
11
|
def part_of_ignored_node?(node)
|
12
12
|
ignored_nodes.map(&:loc).any? do |ignored_loc|
|
13
|
-
if ignored_loc.expression.begin_pos > node.source_range.begin_pos
|
14
|
-
next false
|
15
|
-
end
|
13
|
+
next false if ignored_loc.expression.begin_pos > node.source_range.begin_pos
|
16
14
|
|
17
15
|
ignored_end_pos = if ignored_loc.respond_to?(:heredoc_body)
|
18
16
|
ignored_loc.heredoc_end.end_pos
|
@@ -6,33 +6,76 @@ module RuboCop
|
|
6
6
|
# Here we check if the elements of a multi-line array literal are
|
7
7
|
# aligned.
|
8
8
|
#
|
9
|
-
# @example
|
9
|
+
# @example EnforcedStyle: with_first_element (default)
|
10
|
+
# # good
|
11
|
+
#
|
12
|
+
# array = [1, 2, 3,
|
13
|
+
# 4, 5, 6]
|
14
|
+
# array = ['run',
|
15
|
+
# 'forrest',
|
16
|
+
# 'run']
|
17
|
+
#
|
10
18
|
# # bad
|
11
|
-
#
|
19
|
+
#
|
20
|
+
# array = [1, 2, 3,
|
12
21
|
# 4, 5, 6]
|
13
22
|
# array = ['run',
|
14
23
|
# 'forrest',
|
15
24
|
# 'run']
|
16
25
|
#
|
26
|
+
# @example EnforcedStyle: with_fixed_indentation
|
17
27
|
# # good
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
28
|
+
#
|
29
|
+
# array = [1, 2, 3,
|
30
|
+
# 4, 5, 6]
|
31
|
+
#
|
32
|
+
# # bad
|
33
|
+
#
|
34
|
+
# array = [1, 2, 3,
|
35
|
+
# 4, 5, 6]
|
23
36
|
class ArrayAlignment < Cop
|
24
37
|
include Alignment
|
25
38
|
|
26
|
-
|
27
|
-
|
39
|
+
ALIGN_ELEMENTS_MSG = 'Align the elements of an array literal ' \
|
40
|
+
'if they span more than one line.'
|
41
|
+
|
42
|
+
FIXED_INDENT_MSG = 'Use one level of indentation for elements ' \
|
43
|
+
'following the first line of a multi-line array.'
|
28
44
|
|
29
45
|
def on_array(node)
|
30
|
-
|
46
|
+
return if node.children.size < 2
|
47
|
+
|
48
|
+
check_alignment(node.children, base_column(node, node.children))
|
31
49
|
end
|
32
50
|
|
33
51
|
def autocorrect(node)
|
34
52
|
AlignmentCorrector.correct(processed_source, node, column_delta)
|
35
53
|
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def message(_node)
|
58
|
+
fixed_indentation? ? FIXED_INDENT_MSG : ALIGN_ELEMENTS_MSG
|
59
|
+
end
|
60
|
+
|
61
|
+
def fixed_indentation?
|
62
|
+
cop_config['EnforcedStyle'] == 'with_fixed_indentation'
|
63
|
+
end
|
64
|
+
|
65
|
+
def base_column(node, args)
|
66
|
+
if fixed_indentation?
|
67
|
+
lineno = target_method_lineno(node)
|
68
|
+
line = node.source_range.source_buffer.source_line(lineno)
|
69
|
+
indentation_of_line = /\S.*/.match(line).begin(0)
|
70
|
+
indentation_of_line + configured_indentation_width
|
71
|
+
else
|
72
|
+
display_column(args.first.source_range)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def target_method_lineno(node)
|
77
|
+
node.loc.line
|
78
|
+
end
|
36
79
|
end
|
37
80
|
end
|
38
81
|
end
|
@@ -52,9 +52,11 @@ module RuboCop
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def delimiter_range(node)
|
55
|
-
Parser::Source::Range.new(
|
56
|
-
|
57
|
-
|
55
|
+
Parser::Source::Range.new(
|
56
|
+
node.loc.expression.source_buffer,
|
57
|
+
node.children.compact.last.loc.expression.end_pos,
|
58
|
+
node.loc.expression.end_pos
|
59
|
+
)
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
@@ -23,6 +23,8 @@ module RuboCop
|
|
23
23
|
# do_something
|
24
24
|
# end
|
25
25
|
class ConditionPosition < Cop
|
26
|
+
include RangeHelp
|
27
|
+
|
26
28
|
MSG = 'Place the condition on the same line as `%<keyword>s`.'
|
27
29
|
|
28
30
|
def on_if(node)
|
@@ -34,9 +36,17 @@ module RuboCop
|
|
34
36
|
def on_while(node)
|
35
37
|
check(node)
|
36
38
|
end
|
39
|
+
alias on_until on_while
|
37
40
|
|
38
|
-
def
|
39
|
-
|
41
|
+
def autocorrect(node)
|
42
|
+
lambda do |corrector|
|
43
|
+
range = range_by_whole_lines(
|
44
|
+
node.source_range, include_final_newline: true
|
45
|
+
)
|
46
|
+
|
47
|
+
corrector.insert_after(node.parent.loc.keyword, " #{node.source}")
|
48
|
+
corrector.remove(range)
|
49
|
+
end
|
40
50
|
end
|
41
51
|
|
42
52
|
private
|
@@ -59,6 +59,14 @@ module RuboCop
|
|
59
59
|
check_alignment(node.when_branches.last.loc.keyword, node.loc.else)
|
60
60
|
end
|
61
61
|
|
62
|
+
def on_case_match(node)
|
63
|
+
return unless node.else?
|
64
|
+
|
65
|
+
check_alignment(
|
66
|
+
node.in_pattern_branches.last.loc.keyword, node.loc.else
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
62
70
|
def autocorrect(node)
|
63
71
|
AlignmentCorrector.correct(processed_source, node, column_delta)
|
64
72
|
end
|
@@ -99,9 +99,7 @@ module RuboCop
|
|
99
99
|
lambda do |corrector|
|
100
100
|
line = range_by_whole_lines(node.source_range)
|
101
101
|
|
102
|
-
unless previous_line_empty?(node.first_line)
|
103
|
-
corrector.insert_before(line, "\n")
|
104
|
-
end
|
102
|
+
corrector.insert_before(line, "\n") unless previous_line_empty?(node.first_line)
|
105
103
|
|
106
104
|
correct_next_line_if_denied_style(corrector, node, line)
|
107
105
|
end
|
@@ -120,9 +118,7 @@ module RuboCop
|
|
120
118
|
def correct_next_line_if_denied_style(corrector, node, line)
|
121
119
|
case style
|
122
120
|
when :around
|
123
|
-
unless next_line_empty?(node.last_line)
|
124
|
-
corrector.insert_after(line, "\n")
|
125
|
-
end
|
121
|
+
corrector.insert_after(line, "\n") unless next_line_empty?(node.last_line)
|
126
122
|
when :only_before
|
127
123
|
if next_line_empty?(node.last_line)
|
128
124
|
range = next_empty_line_range(node)
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Checks for a newline after an attribute accessor or a group of them.
|
7
|
+
# `alias` syntax and `alias_method`, `public`, `protected`, and `private` methods are allowed by default.
|
8
|
+
# These are customizable with `AllowAliasSyntax` and `AllowedMethods` options.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# # bad
|
12
|
+
# attr_accessor :foo
|
13
|
+
# def do_something
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# attr_accessor :foo
|
18
|
+
#
|
19
|
+
# def do_something
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # good
|
23
|
+
# attr_accessor :foo
|
24
|
+
# attr_reader :bar
|
25
|
+
# attr_writer :baz
|
26
|
+
# attr :qux
|
27
|
+
#
|
28
|
+
# def do_something
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# @example AllowAliasSyntax: true (default)
|
32
|
+
# # good
|
33
|
+
# attr_accessor :foo
|
34
|
+
# alias :foo? :foo
|
35
|
+
#
|
36
|
+
# def do_something
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# @example AllowAliasSyntax: false
|
40
|
+
# # bad
|
41
|
+
# attr_accessor :foo
|
42
|
+
# alias :foo? :foo
|
43
|
+
#
|
44
|
+
# def do_something
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# # good
|
48
|
+
# attr_accessor :foo
|
49
|
+
#
|
50
|
+
# alias :foo? :foo
|
51
|
+
#
|
52
|
+
# def do_something
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# @example AllowedMethods: ['private']
|
56
|
+
# # good
|
57
|
+
# attr_accessor :foo
|
58
|
+
# private :foo
|
59
|
+
#
|
60
|
+
# def do_something
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
class EmptyLinesAroundAttributeAccessor < Cop
|
64
|
+
include RangeHelp
|
65
|
+
|
66
|
+
MSG = 'Add an empty line after attribute accessor.'
|
67
|
+
|
68
|
+
def on_send(node)
|
69
|
+
return unless node.attribute_accessor?
|
70
|
+
return if next_line_empty?(node.last_line)
|
71
|
+
|
72
|
+
next_line_node = next_line_node(node)
|
73
|
+
return unless require_empty_line?(next_line_node)
|
74
|
+
|
75
|
+
add_offense(node)
|
76
|
+
end
|
77
|
+
|
78
|
+
def autocorrect(node)
|
79
|
+
lambda do |corrector|
|
80
|
+
range = range_by_whole_lines(node.source_range)
|
81
|
+
|
82
|
+
corrector.insert_after(range, "\n")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def next_line_empty?(line)
|
89
|
+
processed_source[line].blank?
|
90
|
+
end
|
91
|
+
|
92
|
+
def require_empty_line?(node)
|
93
|
+
return false unless node&.respond_to?(:type)
|
94
|
+
|
95
|
+
!allow_alias?(node) && !attribute_or_allowed_method?(node)
|
96
|
+
end
|
97
|
+
|
98
|
+
def next_line_node(node)
|
99
|
+
node.parent.children[node.sibling_index + 1]
|
100
|
+
end
|
101
|
+
|
102
|
+
def allow_alias?(node)
|
103
|
+
allow_alias_syntax? && node.alias_type?
|
104
|
+
end
|
105
|
+
|
106
|
+
def attribute_or_allowed_method?(node)
|
107
|
+
return false unless node.send_type?
|
108
|
+
|
109
|
+
node.attribute_accessor? || allowed_method?(node.method_name)
|
110
|
+
end
|
111
|
+
|
112
|
+
def allow_alias_syntax?
|
113
|
+
cop_config.fetch('AllowAliasSyntax', true)
|
114
|
+
end
|
115
|
+
|
116
|
+
def allowed_method?(name)
|
117
|
+
allowed_methods.include?(name.to_s)
|
118
|
+
end
|
119
|
+
|
120
|
+
def allowed_methods
|
121
|
+
cop_config.fetch('AllowedMethods', [])
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
|
-
# rubocop:disable Layout/LineLength
|
6
5
|
module Layout
|
7
6
|
# This cop checks the indentation of the first argument in a method call.
|
8
7
|
# Arguments after the first one are checked by Layout/ArgumentAlignment,
|
@@ -143,7 +142,6 @@ module RuboCop
|
|
143
142
|
# second_param
|
144
143
|
#
|
145
144
|
class FirstArgumentIndentation < Cop
|
146
|
-
# rubocop:enable Layout/LineLength
|
147
145
|
include Alignment
|
148
146
|
include ConfigurableEnforcedStyle
|
149
147
|
include RangeHelp
|
@@ -125,21 +125,13 @@ module RuboCop
|
|
125
125
|
|
126
126
|
def check_right_bracket(right_bracket, left_bracket, left_parenthesis)
|
127
127
|
# if the right bracket is on the same line as the last value, accept
|
128
|
-
return if right_bracket.source_line[0...right_bracket.column]
|
128
|
+
return if /\S/.match?(right_bracket.source_line[0...right_bracket.column])
|
129
129
|
|
130
130
|
expected_column = base_column(left_bracket, left_parenthesis)
|
131
131
|
@column_delta = expected_column - right_bracket.column
|
132
132
|
return if @column_delta.zero?
|
133
133
|
|
134
|
-
msg =
|
135
|
-
'Indent the right bracket the same as the left bracket.'
|
136
|
-
elsif style == :special_inside_parentheses && left_parenthesis
|
137
|
-
'Indent the right bracket the same as the first position ' \
|
138
|
-
'after the preceding left parenthesis.'
|
139
|
-
else
|
140
|
-
'Indent the right bracket the same as the start of the line' \
|
141
|
-
' where the left bracket is.'
|
142
|
-
end
|
134
|
+
msg = msg(left_parenthesis)
|
143
135
|
add_offense(right_bracket, location: right_bracket, message: msg)
|
144
136
|
end
|
145
137
|
|
@@ -161,6 +153,18 @@ module RuboCop
|
|
161
153
|
base_description: base_description
|
162
154
|
)
|
163
155
|
end
|
156
|
+
|
157
|
+
def msg(left_parenthesis)
|
158
|
+
if style == :align_brackets
|
159
|
+
'Indent the right bracket the same as the left bracket.'
|
160
|
+
elsif style == :special_inside_parentheses && left_parenthesis
|
161
|
+
'Indent the right bracket the same as the first position ' \
|
162
|
+
'after the preceding left parenthesis.'
|
163
|
+
else
|
164
|
+
'Indent the right bracket the same as the start of the line' \
|
165
|
+
' where the left bracket is.'
|
166
|
+
end
|
167
|
+
end
|
164
168
|
end
|
165
169
|
end
|
166
170
|
end
|
@@ -128,7 +128,7 @@ module RuboCop
|
|
128
128
|
|
129
129
|
def check_right_brace(right_brace, left_brace, left_parenthesis)
|
130
130
|
# if the right brace is on the same line as the last value, accept
|
131
|
-
return if right_brace.source_line[0...right_brace.column]
|
131
|
+
return if /\S/.match?(right_brace.source_line[0...right_brace.column])
|
132
132
|
|
133
133
|
expected_column = base_column(left_brace, left_parenthesis)
|
134
134
|
@column_delta = expected_column - right_brace.column
|
@@ -36,9 +36,7 @@ module RuboCop
|
|
36
36
|
# ...then each key/value pair is treated as a method 'argument'
|
37
37
|
# when determining where line breaks should appear.
|
38
38
|
if (last_arg = args.last)
|
39
|
-
if last_arg.hash_type? && !last_arg.braces?
|
40
|
-
args = args.concat(args.pop.children)
|
41
|
-
end
|
39
|
+
args = args.concat(args.pop.children) if last_arg.hash_type? && !last_arg.braces?
|
42
40
|
end
|
43
41
|
|
44
42
|
check_method_line_break(node, args)
|