rubocop 0.89.1 → 0.90.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 +1 -1
- data/config/default.yml +79 -11
- data/lib/rubocop.rb +13 -0
- data/lib/rubocop/cached_data.rb +1 -0
- data/lib/rubocop/cli/command.rb +1 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
- data/lib/rubocop/cli/command/show_cops.rb +1 -0
- data/lib/rubocop/cli/command/version.rb +1 -0
- data/lib/rubocop/cli/environment.rb +1 -0
- data/lib/rubocop/comment_config.rb +5 -0
- data/lib/rubocop/config_loader.rb +17 -6
- data/lib/rubocop/config_loader_resolver.rb +1 -0
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_validator.rb +3 -0
- data/lib/rubocop/cop/base.rb +23 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
- data/lib/rubocop/cop/commissioner.rb +47 -7
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
- data/lib/rubocop/cop/documentation.rb +22 -0
- data/lib/rubocop/cop/generator.rb +1 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
- data/lib/rubocop/cop/layout/class_structure.rb +10 -9
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
- data/lib/rubocop/cop/layout/condition_position.rb +13 -15
- data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
- data/lib/rubocop/cop/layout/dot_position.rb +21 -17
- data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
- data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +4 -6
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +6 -7
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
- data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -21
- data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
- data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
- data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
- data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
- data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
- data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +0 -11
- data/lib/rubocop/cop/lint/empty_file.rb +53 -0
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -19
- data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
- data/lib/rubocop/cop/mixin/alignment.rb +3 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
- data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
- data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +17 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
- data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
- data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
- data/lib/rubocop/cop/offense.rb +1 -0
- data/lib/rubocop/cop/severity.rb +0 -8
- data/lib/rubocop/cop/style/case_equality.rb +8 -3
- data/lib/rubocop/cop/style/case_like_if.rb +20 -4
- data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
- data/lib/rubocop/cop/style/guard_clause.rb +1 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +14 -1
- data/lib/rubocop/cop/style/hash_transform_values.rb +14 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +2 -2
- data/lib/rubocop/cop/style/negated_if.rb +6 -6
- data/lib/rubocop/cop/style/negated_unless.rb +6 -6
- data/lib/rubocop/cop/style/negated_while.rb +7 -15
- data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
- data/lib/rubocop/cop/style/next.rb +10 -14
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
- data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
- data/lib/rubocop/cop/style/not.rb +19 -26
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -11
- data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +13 -10
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
- data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
- data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
- data/lib/rubocop/cop/style/proc.rb +6 -6
- data/lib/rubocop/cop/style/raise_args.rb +13 -24
- data/lib/rubocop/cop/style/random_with_offset.rb +15 -16
- data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
- data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
- data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +8 -8
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
- data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
- data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
- data/lib/rubocop/cop/style/return_nil.rb +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -12
- data/lib/rubocop/cop/style/sample.rb +10 -13
- data/lib/rubocop/cop/style/self_assignment.rb +26 -22
- data/lib/rubocop/cop/style/semicolon.rb +6 -9
- data/lib/rubocop/cop/style/send.rb +2 -2
- data/lib/rubocop/cop/style/signal_exception.rb +21 -19
- data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
- data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
- data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
- data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
- data/lib/rubocop/cop/style/string_methods.rb +7 -17
- data/lib/rubocop/cop/style/strip.rb +8 -14
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
- data/lib/rubocop/cop/style/symbol_array.rb +5 -16
- data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
- data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
- data/lib/rubocop/cop/style/unless_else.rb +5 -8
- data/lib/rubocop/cop/style/unpack_first.rb +4 -8
- data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
- data/lib/rubocop/cop/style/when_then.rb +4 -6
- data/lib/rubocop/cop/style/while_until_do.rb +6 -16
- data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
- data/lib/rubocop/cop/style/word_array.rb +5 -23
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
- data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -13
- data/lib/rubocop/cop/team.rb +1 -0
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +3 -5
- data/lib/rubocop/cop/variable_force.rb +2 -0
- data/lib/rubocop/cops_documentation_generator.rb +4 -2
- data/lib/rubocop/core_ext/string.rb +1 -1
- data/lib/rubocop/ext/regexp_node.rb +46 -0
- data/lib/rubocop/file_finder.rb +1 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/html_formatter.rb +2 -0
- data/lib/rubocop/formatter/progress_formatter.rb +2 -1
- data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
- data/lib/rubocop/name_similarity.rb +1 -0
- data/lib/rubocop/options.rb +3 -0
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +1 -0
- data/lib/rubocop/rspec/cop_helper.rb +4 -1
- data/lib/rubocop/rspec/expect_offense.rb +10 -5
- data/lib/rubocop/rspec/shared_contexts.rb +12 -0
- data/lib/rubocop/runner.rb +1 -0
- data/lib/rubocop/string_interpreter.rb +3 -0
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +6 -0
- data/lib/rubocop/version.rb +2 -1
- data/lib/rubocop/yaml_duplication_checker.rb +1 -0
- metadata +15 -2
@@ -16,9 +16,10 @@ module RuboCop
|
|
16
16
|
#
|
17
17
|
# # bad
|
18
18
|
# %x( ls -l )
|
19
|
-
class SpaceInsidePercentLiteralDelimiters <
|
19
|
+
class SpaceInsidePercentLiteralDelimiters < Base
|
20
20
|
include MatchRange
|
21
21
|
include PercentLiteral
|
22
|
+
extend AutoCorrector
|
22
23
|
|
23
24
|
MSG = 'Do not use spaces inside percent literal delimiters.'
|
24
25
|
BEGIN_REGEX = /\A( +)/.freeze
|
@@ -36,21 +37,15 @@ module RuboCop
|
|
36
37
|
add_offenses_for_unnecessary_spaces(node)
|
37
38
|
end
|
38
39
|
|
39
|
-
def autocorrect(node)
|
40
|
-
lambda do |corrector|
|
41
|
-
regex_matches(node) do |match_range|
|
42
|
-
corrector.remove(match_range)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
40
|
private
|
48
41
|
|
49
42
|
def add_offenses_for_unnecessary_spaces(node)
|
50
43
|
return unless node.single_line?
|
51
44
|
|
52
45
|
regex_matches(node) do |match_range|
|
53
|
-
add_offense(
|
46
|
+
add_offense(match_range) do |corrector|
|
47
|
+
corrector.remove(match_range)
|
48
|
+
end
|
54
49
|
end
|
55
50
|
end
|
56
51
|
|
@@ -17,7 +17,9 @@ module RuboCop
|
|
17
17
|
#
|
18
18
|
# # good
|
19
19
|
# 'a'..'z'
|
20
|
-
class SpaceInsideRangeLiteral <
|
20
|
+
class SpaceInsideRangeLiteral < Base
|
21
|
+
extend AutoCorrector
|
22
|
+
|
21
23
|
MSG = 'Space inside range literal.'
|
22
24
|
|
23
25
|
def on_irange(node)
|
@@ -28,21 +30,6 @@ module RuboCop
|
|
28
30
|
check(node)
|
29
31
|
end
|
30
32
|
|
31
|
-
def autocorrect(node)
|
32
|
-
expression = node.source
|
33
|
-
operator = node.loc.operator.source
|
34
|
-
operator_escaped = operator.gsub(/\./, '\.')
|
35
|
-
|
36
|
-
lambda do |corrector|
|
37
|
-
corrector.replace(
|
38
|
-
node,
|
39
|
-
expression
|
40
|
-
.sub(/\s+#{operator_escaped}/, operator)
|
41
|
-
.sub(/#{operator_escaped}\s+/, operator)
|
42
|
-
)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
33
|
private
|
47
34
|
|
48
35
|
def check(node)
|
@@ -55,7 +42,11 @@ module RuboCop
|
|
55
42
|
|
56
43
|
return unless /(\s#{escaped_op})|(#{escaped_op}\s)/.match?(expression)
|
57
44
|
|
58
|
-
add_offense(node)
|
45
|
+
add_offense(node) do |corrector|
|
46
|
+
corrector.replace(
|
47
|
+
node, expression.sub(/\s+#{escaped_op}/, op).sub(/#{escaped_op}\s+/, op)
|
48
|
+
)
|
49
|
+
end
|
59
50
|
end
|
60
51
|
end
|
61
52
|
end
|
@@ -53,9 +53,10 @@ module RuboCop
|
|
53
53
|
# # good
|
54
54
|
# foo[ ]
|
55
55
|
#
|
56
|
-
class SpaceInsideReferenceBrackets <
|
56
|
+
class SpaceInsideReferenceBrackets < Base
|
57
57
|
include SurroundingSpace
|
58
58
|
include ConfigurableEnforcedStyle
|
59
|
+
extend AutoCorrector
|
59
60
|
|
60
61
|
MSG = '%<command>s space inside reference brackets.'
|
61
62
|
EMPTY_MSG = '%<command>s space inside empty reference brackets.'
|
@@ -83,24 +84,20 @@ module RuboCop
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
SpaceCorrector.add_space(processed_source, corrector, left, right)
|
98
|
-
end
|
87
|
+
private
|
88
|
+
|
89
|
+
def autocorrect(corrector, node)
|
90
|
+
left, right = reference_brackets(node)
|
91
|
+
|
92
|
+
if empty_brackets?(left, right)
|
93
|
+
SpaceCorrector.empty_corrections(processed_source, corrector, empty_config, left, right)
|
94
|
+
elsif style == :no_space
|
95
|
+
SpaceCorrector.remove_space(processed_source, corrector, left, right)
|
96
|
+
else
|
97
|
+
SpaceCorrector.add_space(processed_source, corrector, left, right)
|
99
98
|
end
|
100
99
|
end
|
101
100
|
|
102
|
-
private
|
103
|
-
|
104
101
|
def reference_brackets(node)
|
105
102
|
tokens = tokens(node)
|
106
103
|
left = left_ref_bracket(node, tokens)
|
@@ -18,11 +18,12 @@ module RuboCop
|
|
18
18
|
#
|
19
19
|
# # good
|
20
20
|
# var = "This is the #{ space } example"
|
21
|
-
class SpaceInsideStringInterpolation <
|
21
|
+
class SpaceInsideStringInterpolation < Base
|
22
22
|
include Interpolation
|
23
23
|
include SurroundingSpace
|
24
24
|
include ConfigurableEnforcedStyle
|
25
25
|
include RangeHelp
|
26
|
+
extend AutoCorrector
|
26
27
|
|
27
28
|
NO_SPACE_MSG = 'Space inside string interpolation detected.'
|
28
29
|
SPACE_MSG = 'Missing space inside string interpolation detected.'
|
@@ -40,20 +41,18 @@ module RuboCop
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
private
|
45
|
+
|
46
|
+
def autocorrect(corrector, begin_node)
|
47
|
+
delims = delimiters(begin_node)
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
49
|
+
if style == :no_space
|
50
|
+
SpaceCorrector.remove_space(processed_source, corrector, *delims)
|
51
|
+
else
|
52
|
+
SpaceCorrector.add_space(processed_source, corrector, *delims)
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
private
|
56
|
-
|
57
56
|
def delimiters(begin_node)
|
58
57
|
left = processed_source.tokens[index_of_first_token(begin_node)]
|
59
58
|
right = processed_source.tokens[index_of_last_token(begin_node)]
|
@@ -37,11 +37,12 @@ module RuboCop
|
|
37
37
|
# class Foo; end
|
38
38
|
# # EOF
|
39
39
|
#
|
40
|
-
class TrailingEmptyLines <
|
40
|
+
class TrailingEmptyLines < Base
|
41
41
|
include ConfigurableEnforcedStyle
|
42
42
|
include RangeHelp
|
43
|
+
extend AutoCorrector
|
43
44
|
|
44
|
-
def
|
45
|
+
def on_new_investigation
|
45
46
|
buffer = processed_source.buffer
|
46
47
|
return if buffer.source.empty?
|
47
48
|
|
@@ -57,28 +58,22 @@ module RuboCop
|
|
57
58
|
|
58
59
|
return unless blank_lines != wanted_blank_lines
|
59
60
|
|
60
|
-
offense_detected(buffer, wanted_blank_lines, blank_lines,
|
61
|
-
whitespace_at_end)
|
62
|
-
end
|
63
|
-
|
64
|
-
def autocorrect(range)
|
65
|
-
lambda do |corrector|
|
66
|
-
corrector.replace(range, style == :final_newline ? "\n" : "\n\n")
|
67
|
-
end
|
61
|
+
offense_detected(buffer, wanted_blank_lines, blank_lines, whitespace_at_end)
|
68
62
|
end
|
69
63
|
|
70
64
|
private
|
71
65
|
|
72
|
-
def offense_detected(buffer, wanted_blank_lines, blank_lines,
|
73
|
-
whitespace_at_end)
|
66
|
+
def offense_detected(buffer, wanted_blank_lines, blank_lines, whitespace_at_end)
|
74
67
|
begin_pos = buffer.source.length - whitespace_at_end.length
|
75
68
|
autocorrect_range = range_between(begin_pos, buffer.source.length)
|
76
69
|
begin_pos += 1 unless whitespace_at_end.empty?
|
77
70
|
report_range = range_between(begin_pos, buffer.source.length)
|
78
71
|
|
79
|
-
add_offense(
|
80
|
-
|
81
|
-
|
72
|
+
add_offense(
|
73
|
+
report_range, message: message(wanted_blank_lines, blank_lines)
|
74
|
+
) do |corrector|
|
75
|
+
corrector.replace(autocorrect_range, style == :final_newline ? "\n" : "\n\n")
|
76
|
+
end
|
82
77
|
end
|
83
78
|
|
84
79
|
def ends_in_end?(processed_source)
|
@@ -28,12 +28,13 @@ module RuboCop
|
|
28
28
|
# x = 0
|
29
29
|
# RUBY
|
30
30
|
#
|
31
|
-
class TrailingWhitespace <
|
31
|
+
class TrailingWhitespace < Base
|
32
32
|
include RangeHelp
|
33
|
+
extend AutoCorrector
|
33
34
|
|
34
35
|
MSG = 'Trailing whitespace detected.'
|
35
36
|
|
36
|
-
def
|
37
|
+
def on_new_investigation
|
37
38
|
heredoc_ranges = extract_heredoc_ranges(processed_source.ast)
|
38
39
|
processed_source.lines.each_with_index do |line, index|
|
39
40
|
lineno = index + 1
|
@@ -41,18 +42,13 @@ module RuboCop
|
|
41
42
|
next unless line.end_with?(' ', "\t")
|
42
43
|
next if skip_heredoc? && inside_heredoc?(heredoc_ranges, lineno)
|
43
44
|
|
44
|
-
range =
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
add_offense(range, location: range)
|
45
|
+
range = offense_range(lineno, line)
|
46
|
+
add_offense(range) do |corrector|
|
47
|
+
corrector.remove(range)
|
48
|
+
end
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
def autocorrect(range)
|
53
|
-
->(corrector) { corrector.remove(range) }
|
54
|
-
end
|
55
|
-
|
56
52
|
private
|
57
53
|
|
58
54
|
def skip_heredoc?
|
@@ -71,6 +67,10 @@ module RuboCop
|
|
71
67
|
(body.first_line...body.last_line)
|
72
68
|
end
|
73
69
|
end
|
70
|
+
|
71
|
+
def offense_range(lineno, line)
|
72
|
+
source_range(processed_source.buffer, lineno, (line.rstrip.length)...(line.length))
|
73
|
+
end
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
return unless node.binary_operation?
|
36
36
|
|
37
37
|
lhs, operation, rhs = *node
|
38
|
-
return if MATH_OPERATORS.include?(node.method_name) &&
|
38
|
+
return if MATH_OPERATORS.include?(node.method_name) && lhs.basic_literal?
|
39
39
|
|
40
40
|
add_offense(node, message: format(MSG, op: operation)) if lhs == rhs
|
41
41
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for duplicate `require`s and `require_relative`s.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# require 'foo'
|
11
|
+
# require 'bar'
|
12
|
+
# require 'foo'
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# require 'foo'
|
16
|
+
# require 'bar'
|
17
|
+
#
|
18
|
+
class DuplicateRequire < Base
|
19
|
+
MSG = 'Duplicate `%<method>s` detected.'
|
20
|
+
REQUIRE_METHODS = %i[require require_relative].freeze
|
21
|
+
|
22
|
+
def_node_matcher :require_call?, <<~PATTERN
|
23
|
+
(send {nil? (const _ :Kernel)} {:#{REQUIRE_METHODS.join(' :')}} _)
|
24
|
+
PATTERN
|
25
|
+
|
26
|
+
def on_new_investigation
|
27
|
+
# Holds the known required files for a given parent node (used as key)
|
28
|
+
@required = Hash.new { |h, k| h[k] = Set.new }.compare_by_identity
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
def on_send(node)
|
33
|
+
return unless REQUIRE_METHODS.include?(node.method_name) && require_call?(node)
|
34
|
+
return if @required[node.parent].add?(node.first_argument)
|
35
|
+
|
36
|
+
add_offense(node, message: format(MSG, method: node.method_name))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop enforces that Ruby source files are not empty.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# # Empty file
|
11
|
+
#
|
12
|
+
# # good
|
13
|
+
# # File containing non commented source lines
|
14
|
+
#
|
15
|
+
# @example AllowComments: true (default)
|
16
|
+
# # good
|
17
|
+
# # File consisting only of comments
|
18
|
+
#
|
19
|
+
# @example AllowComments: false
|
20
|
+
# # bad
|
21
|
+
# # File consisting only of comments
|
22
|
+
#
|
23
|
+
class EmptyFile < Base
|
24
|
+
include RangeHelp
|
25
|
+
|
26
|
+
MSG = 'Empty file detected.'
|
27
|
+
|
28
|
+
def on_new_investigation
|
29
|
+
return unless offending?
|
30
|
+
|
31
|
+
range = source_range(processed_source.buffer, 1, 0)
|
32
|
+
add_offense(range)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def offending?
|
38
|
+
empty_file? || (!cop_config['AllowComments'] && contains_only_comments?)
|
39
|
+
end
|
40
|
+
|
41
|
+
def empty_file?
|
42
|
+
processed_source.buffer.source.empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
def contains_only_comments?
|
46
|
+
processed_source.lines.all? do |line|
|
47
|
+
line.blank? || comment_line?(line)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -56,8 +56,8 @@ module RuboCop
|
|
56
56
|
def on_def(node)
|
57
57
|
return unless offender?(node)
|
58
58
|
|
59
|
-
if node.method?(:initialize)
|
60
|
-
add_offense(node, message: CONSTRUCTOR_MSG)
|
59
|
+
if node.method?(:initialize) && inside_class_with_stateful_parent?(node)
|
60
|
+
add_offense(node, message: CONSTRUCTOR_MSG)
|
61
61
|
elsif callback_method_def?(node)
|
62
62
|
add_offense(node, message: CALLBACK_MSG)
|
63
63
|
end
|
@@ -25,44 +25,11 @@ module RuboCop
|
|
25
25
|
'in a Regexp literal.'
|
26
26
|
|
27
27
|
def on_regexp(node)
|
28
|
-
return if
|
29
|
-
|
30
|
-
begin
|
31
|
-
tree = Regexp::Parser.parse(node.content)
|
32
|
-
# Returns if a regular expression that cannot be processed by regexp_parser gem.
|
33
|
-
# https://github.com/rubocop-hq/rubocop/issues/8083
|
34
|
-
rescue Regexp::Scanner::ScannerError
|
35
|
-
return
|
36
|
-
end
|
37
|
-
|
38
|
-
return unless named_capture?(tree)
|
39
|
-
return unless numbered_capture?(tree)
|
28
|
+
return if node.each_capture(named: false).none?
|
29
|
+
return if node.each_capture(named: true).none?
|
40
30
|
|
41
31
|
add_offense(node)
|
42
32
|
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def contain_non_literal?(node)
|
47
|
-
if node.respond_to?(:type) && (node.variable? || node.send_type? || node.const_type?)
|
48
|
-
return true
|
49
|
-
end
|
50
|
-
return false unless node.respond_to?(:children)
|
51
|
-
|
52
|
-
node.children.any? { |child| contain_non_literal?(child) }
|
53
|
-
end
|
54
|
-
|
55
|
-
def named_capture?(tree)
|
56
|
-
tree.each_expression.any? do |e|
|
57
|
-
e.instance_of?(Regexp::Expression::Group::Capture)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def numbered_capture?(tree)
|
62
|
-
tree.each_expression.any? do |e|
|
63
|
-
e.instance_of?(Regexp::Expression::Group::Named)
|
64
|
-
end
|
65
|
-
end
|
66
33
|
end
|
67
34
|
end
|
68
35
|
end
|