rubocop 0.82.0 → 0.86.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 +27 -19
- data/config/default.yml +111 -23
- data/lib/rubocop.rb +16 -59
- data/lib/rubocop/ast_aliases.rb +8 -0
- data/lib/rubocop/cli.rb +3 -3
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
- 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 +6 -2
- data/lib/rubocop/config_loader.rb +19 -24
- data/lib/rubocop/config_loader_resolver.rb +45 -6
- data/lib/rubocop/config_store.rb +12 -2
- data/lib/rubocop/config_validator.rb +2 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
- data/lib/rubocop/cop/commissioner.rb +0 -21
- data/lib/rubocop/cop/cop.rb +36 -21
- 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/generator.rb +4 -3
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/ignored_node.rb +1 -3
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
- 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/condition_position.rb +12 -2
- 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 +128 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +3 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -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 +7 -7
- 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 +21 -18
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- 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 +19 -2
- 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/layout/trailing_whitespace.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
- 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/duplicate_methods.rb +1 -5
- data/lib/rubocop/cop/lint/empty_when.rb +29 -6
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
- 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/literal_as_condition.rb +10 -13
- 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_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
- 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/redundant_cop_disable_directive.rb +5 -8
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
- 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 +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
- data/lib/rubocop/cop/lint/syntax.rb +1 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- 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 +6 -1
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- 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/array_min_size.rb +1 -3
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
- 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/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -1
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
- 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/statement_modifier.rb +7 -23
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -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/mixin/uncommunicative_name.rb +3 -3
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- 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 -5
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +63 -10
- data/lib/rubocop/cop/severity.rb +1 -3
- 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/block_delimiters.rb +4 -12
- data/lib/rubocop/cop/style/case_equality.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- 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/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 +1 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -5
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- 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/guard_clause.rb +25 -2
- 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_with_semicolon.rb +16 -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/lambda_call.rb +0 -20
- 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_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/multiline_when_then.rb +16 -1
- 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_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/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +103 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -7
- data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -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/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/slicing_with_range.rb +39 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
- data/lib/rubocop/cop/style/struct_inheritance.rb +21 -0
- data/lib/rubocop/cop/style/symbol_array.rb +5 -5
- 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/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/team.rb +69 -25
- data/lib/rubocop/cop/util.rb +27 -3
- data/lib/rubocop/cop/utils/format_string.rb +18 -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 +1 -3
- 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/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 +18 -9
- data/lib/rubocop/options.rb +26 -11
- data/lib/rubocop/path_util.rb +2 -2
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/remote_config.rb +1 -3
- data/lib/rubocop/result_cache.rb +5 -7
- data/lib/rubocop/rspec/cop_helper.rb +2 -25
- data/lib/rubocop/rspec/expect_offense.rb +58 -15
- data/lib/rubocop/rspec/shared_contexts.rb +54 -16
- data/lib/rubocop/runner.rb +20 -13
- data/lib/rubocop/target_finder.rb +8 -8
- data/lib/rubocop/target_ruby.rb +4 -1
- data/lib/rubocop/version.rb +5 -3
- metadata +51 -74
- 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 -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 -202
- data/lib/rubocop/node_pattern.rb +0 -887
- data/lib/rubocop/processed_source.rb +0 -213
- data/lib/rubocop/string_util.rb +0 -14
- data/lib/rubocop/token.rb +0 -114
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
# > Condition -- a logical/Boolean test, == != <= >= < > else case
|
20
20
|
# > default try catch ? and unary conditionals.
|
21
21
|
# > http://c2.com/cgi/wiki?AbcMetric
|
22
|
-
CONDITION_NODES = CyclomaticComplexity::COUNTED_NODES.freeze
|
22
|
+
CONDITION_NODES = (CyclomaticComplexity::COUNTED_NODES - %i[block block_pass]).freeze
|
23
23
|
|
24
24
|
def self.calculate(node)
|
25
25
|
new(node).calculate
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Metrics
|
6
|
+
module Utils
|
7
|
+
# Used to identify iterating blocks like `.map{}` and `.map(&:...)`
|
8
|
+
module IteratingBlock
|
9
|
+
enumerable = %i[
|
10
|
+
all? any? chain chunk chunk_while collect collect_concat count cycle
|
11
|
+
detect drop drop_while each each_cons each_entry each_slice
|
12
|
+
each_with_index each_with_object entries filter filter_map find
|
13
|
+
find_all find_index flat_map grep grep_v group_by inject lazy map
|
14
|
+
max max_by min min_by minmax minmax_by none? one? partition reduce
|
15
|
+
reject reverse_each select slice_after slice_before slice_when sort
|
16
|
+
sort_by sum take take_while tally to_h uniq zip
|
17
|
+
]
|
18
|
+
|
19
|
+
enumerator = %i[with_index with_object]
|
20
|
+
|
21
|
+
array = %i[
|
22
|
+
bsearch bsearch_index collect! combination d_permutation delete_if
|
23
|
+
each_index keep_if map! permutation product reject! repeat
|
24
|
+
repeated_combination select! sort sort! sort_by sort_by
|
25
|
+
]
|
26
|
+
|
27
|
+
hash = %i[
|
28
|
+
each_key each_pair each_value fetch fetch_values has_key? merge
|
29
|
+
merge! transform_keys transform_keys! transform_values
|
30
|
+
transform_values!
|
31
|
+
]
|
32
|
+
|
33
|
+
KNOWN_ITERATING_METHODS = (Set.new(enumerable) + enumerator + array + hash).freeze
|
34
|
+
|
35
|
+
# Returns the name of the method called with a block
|
36
|
+
# if node is a block node, or a block-pass node.
|
37
|
+
def block_method_name(node)
|
38
|
+
case node.type
|
39
|
+
when :block
|
40
|
+
node.method_name
|
41
|
+
when :block_pass
|
42
|
+
node.parent.method_name
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns true iff name is a known iterating type (e.g. :each, :transform_values)
|
47
|
+
def iterating_method?(name)
|
48
|
+
KNOWN_ITERATING_METHODS.include? name
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns nil if node is neither a block node or a block-pass node.
|
52
|
+
# Otherwise returns true/false if method call is a known iterating call
|
53
|
+
def iterating_block?(node)
|
54
|
+
name = block_method_name(node)
|
55
|
+
name && iterating_method?(name)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -24,15 +24,15 @@ module RuboCop
|
|
24
24
|
|
25
25
|
offset = Regexp.last_match(1).length
|
26
26
|
|
27
|
-
Regexp.last_match(4).scan(/[^,]
|
27
|
+
Regexp.last_match(4).scan(/[^,]+|\W+/) do |name|
|
28
28
|
trimmed_name = name.strip
|
29
29
|
|
30
|
-
break if contain_plain_comment?(trimmed_name)
|
31
|
-
|
32
30
|
unless valid_content_token?(trimmed_name)
|
33
31
|
check_cop_name(trimmed_name, comment, offset)
|
34
32
|
end
|
35
33
|
|
34
|
+
break if contain_unexpected_character_for_department_name?(name)
|
35
|
+
|
36
36
|
offset += name.length
|
37
37
|
end
|
38
38
|
end
|
@@ -64,12 +64,12 @@ module RuboCop
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def valid_content_token?(content_token)
|
67
|
-
|
68
|
-
|
67
|
+
/\W+/.match?(content_token) ||
|
68
|
+
DISABLING_COPS_CONTENT_TOKEN.match?(content_token)
|
69
69
|
end
|
70
70
|
|
71
|
-
def
|
72
|
-
name
|
71
|
+
def contain_unexpected_character_for_department_name?(name)
|
72
|
+
name.match?(%r{[^A-z/, ]})
|
73
73
|
end
|
74
74
|
|
75
75
|
def qualified_legacy_cop_name(cop_name)
|
@@ -25,9 +25,7 @@ module RuboCop
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def check_alignment(items, base_column = nil)
|
28
|
-
unless items.empty?
|
29
|
-
base_column ||= display_column(items.first.source_range)
|
30
|
-
end
|
28
|
+
base_column ||= display_column(items.first.source_range) unless items.empty?
|
31
29
|
|
32
30
|
each_bad_alignment(items, base_column) do |current|
|
33
31
|
expr = current.source_range
|
@@ -48,9 +48,7 @@ module RuboCop
|
|
48
48
|
def smallest_percent_size(style, ary_size)
|
49
49
|
@smallest_percent ||= Float::INFINITY
|
50
50
|
|
51
|
-
if style == :percent && ary_size < @smallest_percent
|
52
|
-
@smallest_percent = ary_size
|
53
|
-
end
|
51
|
+
@smallest_percent = ary_size if style == :percent && ary_size < @smallest_percent
|
54
52
|
|
55
53
|
@smallest_percent
|
56
54
|
end
|
@@ -88,9 +88,7 @@ module RuboCop
|
|
88
88
|
# or redundant edits, we only mark one offense at a time.
|
89
89
|
return true if contained_by_breakable_collection_on_same_line?(node)
|
90
90
|
|
91
|
-
if contained_by_multiline_collection_that_could_be_broken_up?(node)
|
92
|
-
return true
|
93
|
-
end
|
91
|
+
return true if contained_by_multiline_collection_that_could_be_broken_up?(node)
|
94
92
|
|
95
93
|
false
|
96
94
|
end
|
@@ -141,9 +139,7 @@ module RuboCop
|
|
141
139
|
next unless ancestor.send_type?
|
142
140
|
|
143
141
|
args = process_args(ancestor.arguments)
|
144
|
-
if breakable_collection?(ancestor, args)
|
145
|
-
return children_could_be_broken_up?(args)
|
146
|
-
end
|
142
|
+
return children_could_be_broken_up?(args) if breakable_collection?(ancestor, args)
|
147
143
|
end
|
148
144
|
|
149
145
|
false
|
@@ -175,9 +171,7 @@ module RuboCop
|
|
175
171
|
# ...then each key/value pair is treated as a method 'argument'
|
176
172
|
# when determining where line breaks should appear.
|
177
173
|
if (last_arg = args.last)
|
178
|
-
if last_arg.hash_type? && !last_arg.braces?
|
179
|
-
args = args.concat(args.pop.children)
|
180
|
-
end
|
174
|
+
args = args.concat(args.pop.children) if last_arg.hash_type? && !last_arg.braces?
|
181
175
|
end
|
182
176
|
args
|
183
177
|
end
|
@@ -67,9 +67,7 @@ module RuboCop
|
|
67
67
|
def style
|
68
68
|
@style ||= begin
|
69
69
|
s = cop_config[style_parameter_name].to_sym
|
70
|
-
unless supported_styles.include?(s)
|
71
|
-
raise "Unknown style #{s} selected!"
|
72
|
-
end
|
70
|
+
raise "Unknown style #{s} selected!" unless supported_styles.include?(s)
|
73
71
|
|
74
72
|
s
|
75
73
|
end
|
@@ -18,14 +18,12 @@ module RuboCop
|
|
18
18
|
|
19
19
|
def report_opposing_styles(node, name)
|
20
20
|
alternative_styles.each do |alternative|
|
21
|
-
if valid_name?(node, name, alternative)
|
22
|
-
return unexpected_style_detected(alternative)
|
23
|
-
end
|
21
|
+
return unexpected_style_detected(alternative) if valid_name?(node, name, alternative)
|
24
22
|
end
|
25
23
|
end
|
26
24
|
|
27
25
|
def valid_name?(node, name, given_style = style)
|
28
|
-
name.match(self.class::FORMATS.fetch(given_style)) ||
|
26
|
+
name.match?(self.class::FORMATS.fetch(given_style)) ||
|
29
27
|
class_emitter_method?(node, name)
|
30
28
|
end
|
31
29
|
|
@@ -41,11 +41,11 @@ module RuboCop
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def interpreter_directive_comment?(comment)
|
44
|
-
|
44
|
+
/^#\s*(frozen_string_literal|encoding):/.match?(comment.text)
|
45
45
|
end
|
46
46
|
|
47
47
|
def rubocop_directive_comment?(comment)
|
48
|
-
comment.text
|
48
|
+
CommentConfig::COMMENT_DIRECTIVE_REGEXP.match?(comment.text)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
|
52
52
|
def accept_end_kw_alignment?(end_loc)
|
53
53
|
end_loc.nil? || # Discard modifier forms of if/while/until.
|
54
|
-
processed_source.lines[end_loc.line - 1]
|
54
|
+
!/\A[ \t]*end/.match?(processed_source.lines[end_loc.line - 1])
|
55
55
|
end
|
56
56
|
|
57
57
|
def style_parameter_name
|
@@ -46,7 +46,16 @@ module RuboCop
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def leading_comment_lines
|
49
|
-
processed_source.
|
49
|
+
first_non_comment_token = processed_source.tokens.find do |token|
|
50
|
+
!token.comment?
|
51
|
+
end
|
52
|
+
|
53
|
+
if first_non_comment_token
|
54
|
+
# `line` is 1-indexed so we need to subtract 1 to get the array index
|
55
|
+
processed_source.lines[0...first_non_comment_token.line - 1]
|
56
|
+
else
|
57
|
+
processed_source.lines
|
58
|
+
end
|
50
59
|
end
|
51
60
|
end
|
52
61
|
end
|
@@ -132,7 +132,14 @@ module RuboCop
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def self.from_map_to_h(node, match)
|
135
|
-
strip_trailing_chars =
|
135
|
+
strip_trailing_chars = 0
|
136
|
+
|
137
|
+
unless node.parent&.block_type?
|
138
|
+
map_range = node.children.first.source_range
|
139
|
+
node_range = node.source_range
|
140
|
+
strip_trailing_chars = node_range.end_pos - map_range.end_pos
|
141
|
+
end
|
142
|
+
|
136
143
|
new(match, node.children.first, 0, strip_trailing_chars)
|
137
144
|
end
|
138
145
|
|
@@ -18,7 +18,7 @@ module RuboCop
|
|
18
18
|
|
19
19
|
return false unless comment
|
20
20
|
|
21
|
-
comment.text.match(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
|
21
|
+
comment.text.match?(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
|
22
22
|
end
|
23
23
|
|
24
24
|
def allow_uri?
|
@@ -63,7 +63,8 @@ module RuboCop
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def tab_indentation_width
|
66
|
-
config.for_cop('Layout/IndentationStyle')['IndentationWidth']
|
66
|
+
config.for_cop('Layout/IndentationStyle')['IndentationWidth'] ||
|
67
|
+
config.for_cop('Layout/IndentationWidth')['Width']
|
67
68
|
end
|
68
69
|
|
69
70
|
def uri_regexp
|
@@ -152,7 +152,7 @@ module RuboCop
|
|
152
152
|
expression
|
153
153
|
end
|
154
154
|
|
155
|
-
def argument_in_method_call(node, kind)
|
155
|
+
def argument_in_method_call(node, kind) # rubocop:todo Metrics/CyclomaticComplexity
|
156
156
|
node.each_ancestor(:send, :block).find do |a|
|
157
157
|
# If the node is inside a block, it makes no difference if that block
|
158
158
|
# is an argument in a method call. It doesn't count.
|
@@ -9,8 +9,7 @@ module RuboCop
|
|
9
9
|
def parens_required?(node)
|
10
10
|
range = node.source_range
|
11
11
|
source = range.source_buffer.source
|
12
|
-
source[range.begin_pos - 1]
|
13
|
-
source[range.end_pos] =~ /[a-z]/
|
12
|
+
/[a-z]/.match?(source[range.begin_pos - 1]) || /[a-z]/.match?(source[range.end_pos])
|
14
13
|
end
|
15
14
|
end
|
16
15
|
end
|
@@ -109,7 +109,7 @@ module RuboCop
|
|
109
109
|
|
110
110
|
def move_pos(src, pos, step, condition, regexp)
|
111
111
|
offset = step == -1 ? -1 : 0
|
112
|
-
pos += step while condition && src[pos + offset]
|
112
|
+
pos += step while condition && regexp.match?(src[pos + offset])
|
113
113
|
pos.negative? ? 0 : pos
|
114
114
|
end
|
115
115
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for handling Regexp literals.
|
6
|
+
module RegexpLiteralHelp
|
7
|
+
private
|
8
|
+
|
9
|
+
def freespace_mode_regexp?(node)
|
10
|
+
regopt = node.children.find(&:regopt_type?)
|
11
|
+
|
12
|
+
regopt.children.include?(:x)
|
13
|
+
end
|
14
|
+
|
15
|
+
def pattern_source(node)
|
16
|
+
freespace_mode = freespace_mode_regexp?(node)
|
17
|
+
|
18
|
+
node.children.reject(&:regopt_type?).map do |child|
|
19
|
+
source_with_comments_and_interpolations_blanked(child, freespace_mode)
|
20
|
+
end.join
|
21
|
+
end
|
22
|
+
|
23
|
+
def source_with_comments_and_interpolations_blanked(child, freespace_mode)
|
24
|
+
source = child.source
|
25
|
+
|
26
|
+
# We don't want to consider the contents of interpolations or free-space mode comments as
|
27
|
+
# part of the pattern source, but need to preserve their width, to allow offsets to
|
28
|
+
# correctly line up with the original source: spaces have no effect, and preserve width.
|
29
|
+
if child.begin_type?
|
30
|
+
replace_match_with_spaces(source, /.*/) # replace all content
|
31
|
+
elsif freespace_mode
|
32
|
+
replace_match_with_spaces(source, /(?<!\\)#.*/) # replace any comments
|
33
|
+
else
|
34
|
+
source
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def replace_match_with_spaces(source, pattern)
|
39
|
+
source.sub(pattern) { ' ' * Regexp.last_match[0].length }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -4,6 +4,8 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for modifier cops.
|
6
6
|
module StatementModifier
|
7
|
+
include LineLengthHelp
|
8
|
+
|
7
9
|
private
|
8
10
|
|
9
11
|
def single_line_as_modifier?(node)
|
@@ -34,21 +36,14 @@ module RuboCop
|
|
34
36
|
def modifier_fits_on_single_line?(node)
|
35
37
|
return true unless max_line_length
|
36
38
|
|
37
|
-
|
38
|
-
node.body.source_length)
|
39
|
-
|
40
|
-
modifier_length <= max_line_length
|
39
|
+
length_in_modifier_form(node, node.condition) <= max_line_length
|
41
40
|
end
|
42
41
|
|
43
|
-
def length_in_modifier_form(node, cond
|
42
|
+
def length_in_modifier_form(node, cond)
|
44
43
|
keyword = node.loc.keyword
|
45
|
-
|
46
|
-
indentation
|
47
|
-
|
48
|
-
cond_length = cond.source_range.size
|
49
|
-
space = 1
|
50
|
-
|
51
|
-
indentation + body_length + space + kw_length + space + cond_length
|
44
|
+
indentation = keyword.source_line[/^\s*/]
|
45
|
+
line_length("#{indentation}#{node.body.source} #{keyword.source} " \
|
46
|
+
"#{cond.source}")
|
52
47
|
end
|
53
48
|
|
54
49
|
def max_line_length
|
@@ -56,17 +51,6 @@ module RuboCop
|
|
56
51
|
|
57
52
|
config.for_cop('Layout/LineLength')['Max']
|
58
53
|
end
|
59
|
-
|
60
|
-
def indentation_multiplier
|
61
|
-
return 1 if config.for_cop('Layout/IndentationStyle')['Enabled']
|
62
|
-
|
63
|
-
default_configuration = RuboCop::ConfigLoader.default_configuration
|
64
|
-
config.for_cop('Layout/IndentationStyle')['IndentationWidth'] ||
|
65
|
-
config.for_cop('Layout/IndentationWidth')['Width'] ||
|
66
|
-
default_configuration
|
67
|
-
.for_cop('Layout/IndentationStyle')['IndentationWidth'] ||
|
68
|
-
default_configuration.for_cop('Layout/IndentationWidth')['Width']
|
69
|
-
end
|
70
54
|
end
|
71
55
|
end
|
72
56
|
end
|