rubocop 0.51.0 → 0.52.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 -2
- data/config/default.yml +86 -10
- data/config/disabled.yml +9 -4
- data/config/enabled.yml +1105 -1006
- data/lib/rubocop.rb +30 -3
- data/lib/rubocop/ast/builder.rb +2 -0
- data/lib/rubocop/ast/node.rb +24 -2
- data/lib/rubocop/ast/node/args_node.rb +17 -0
- data/lib/rubocop/ast/node/array_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
- data/lib/rubocop/ast/node/send_node.rb +20 -0
- data/lib/rubocop/ast/node/str_node.rb +14 -0
- data/lib/rubocop/ast/node/symbol_node.rb +20 -0
- data/lib/rubocop/ast/traversal.rb +4 -4
- data/lib/rubocop/cli.rb +45 -4
- data/lib/rubocop/comment_config.rb +2 -5
- data/lib/rubocop/config.rb +42 -8
- data/lib/rubocop/config_loader.rb +39 -100
- data/lib/rubocop/config_loader_resolver.rb +99 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/cop.rb +16 -46
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
- data/lib/rubocop/cop/generator.rb +23 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
- data/lib/rubocop/cop/layout/align_hash.rb +16 -16
- data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
- data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
- data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
- data/lib/rubocop/cop/layout/class_structure.rb +306 -0
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
- data/lib/rubocop/cop/layout/dot_position.rb +22 -13
- data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
- data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indent_array.rb +67 -20
- data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
- data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
- data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
- data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
- data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
- data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
- data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
- data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
- data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
- data/lib/rubocop/cop/layout/tab.rb +2 -2
- data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
- data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
- data/lib/rubocop/cop/lint/else_layout.rb +2 -2
- data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
- data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
- data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/script_permission.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
- data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
- data/lib/rubocop/cop/message_annotator.rb +4 -2
- data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +3 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
- data/lib/rubocop/cop/metrics/line_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +3 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
- data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
- data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
- data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
- data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
- data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
- data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
- data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
- data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
- data/lib/rubocop/cop/naming/constant_name.rb +32 -3
- data/lib/rubocop/cop/naming/file_name.rb +19 -8
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
- data/lib/rubocop/cop/naming/method_name.rb +20 -14
- data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
- data/lib/rubocop/cop/naming/variable_name.rb +17 -2
- data/lib/rubocop/cop/naming/variable_number.rb +10 -27
- data/lib/rubocop/cop/offense.rb +6 -1
- data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
- data/lib/rubocop/cop/performance/casecmp.rb +5 -4
- data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
- data/lib/rubocop/cop/performance/count.rb +5 -4
- data/lib/rubocop/cop/performance/detect.rb +7 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
- data/lib/rubocop/cop/performance/end_with.rb +2 -2
- data/lib/rubocop/cop/performance/flat_map.rb +3 -2
- data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
- data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
- data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
- data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
- data/lib/rubocop/cop/performance/size.rb +2 -2
- data/lib/rubocop/cop/performance/start_with.rb +2 -2
- data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
- data/lib/rubocop/cop/performance/times_map.rb +14 -15
- data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
- data/lib/rubocop/cop/rails/action_filter.rb +22 -0
- data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
- data/lib/rubocop/cop/rails/application_job.rb +4 -2
- data/lib/rubocop/cop/rails/application_record.rb +4 -2
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
- data/lib/rubocop/cop/rails/delegate.rb +20 -25
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
- data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
- data/lib/rubocop/cop/rails/exit.rb +7 -0
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
- data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
- data/lib/rubocop/cop/rails/output.rb +9 -0
- data/lib/rubocop/cop/rails/output_safety.rb +14 -20
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
- data/lib/rubocop/cop/rails/presence.rb +105 -0
- data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
- data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
- data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
- data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
- data/lib/rubocop/cop/rails/save_bang.rb +2 -2
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
- data/lib/rubocop/cop/rails/validation.rb +7 -7
- data/lib/rubocop/cop/security/json_load.rb +4 -2
- data/lib/rubocop/cop/security/marshal_load.rb +4 -2
- data/lib/rubocop/cop/style/alias.rb +24 -26
- data/lib/rubocop/cop/style/and_or.rb +34 -28
- data/lib/rubocop/cop/style/array_join.rb +9 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
- data/lib/rubocop/cop/style/attr.rb +14 -4
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
- data/lib/rubocop/cop/style/block_comments.rb +14 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
- data/lib/rubocop/cop/style/case_equality.rb +12 -0
- data/lib/rubocop/cop/style/character_literal.rb +10 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
- data/lib/rubocop/cop/style/class_check.rb +28 -9
- data/lib/rubocop/cop/style/class_methods.rb +8 -8
- data/lib/rubocop/cop/style/class_vars.rb +4 -3
- data/lib/rubocop/cop/style/collection_methods.rb +4 -2
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
- data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
- data/lib/rubocop/cop/style/command_literal.rb +70 -21
- data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
- data/lib/rubocop/cop/style/copyright.rb +19 -20
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +17 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +5 -5
- data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_else.rb +52 -22
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
- data/lib/rubocop/cop/style/empty_literal.rb +17 -5
- data/lib/rubocop/cop/style/empty_method.rb +4 -10
- data/lib/rubocop/cop/style/encoding.rb +2 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
- data/lib/rubocop/cop/style/even_odd.rb +4 -2
- data/lib/rubocop/cop/style/extend_self.rb +92 -0
- data/lib/rubocop/cop/style/flip_flop.rb +11 -0
- data/lib/rubocop/cop/style/format_string.rb +29 -2
- data/lib/rubocop/cop/style/format_string_token.rb +15 -14
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
- data/lib/rubocop/cop/style/global_vars.rb +11 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
- data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +23 -31
- data/lib/rubocop/cop/style/lambda_call.rb +15 -9
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
- data/lib/rubocop/cop/style/method_missing.rb +8 -8
- data/lib/rubocop/cop/style/min_max.rb +12 -12
- data/lib/rubocop/cop/style/missing_else.rb +5 -4
- data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
- data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
- data/lib/rubocop/cop/style/module_function.rb +17 -5
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
- data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
- data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
- data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
- data/lib/rubocop/cop/style/negated_if.rb +22 -30
- data/lib/rubocop/cop/style/negated_while.rb +1 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
- data/lib/rubocop/cop/style/next.rb +39 -11
- data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
- data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
- data/lib/rubocop/cop/style/not.rb +14 -4
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
- data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
- data/lib/rubocop/cop/style/option_hash.rb +11 -14
- data/lib/rubocop/cop/style/or_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
- data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
- data/lib/rubocop/cop/style/proc.rb +8 -0
- data/lib/rubocop/cop/style/raise_args.rb +8 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
- data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
- data/lib/rubocop/cop/style/redundant_return.rb +5 -4
- data/lib/rubocop/cop/style/redundant_self.rb +25 -26
- data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
- data/lib/rubocop/cop/style/return_nil.rb +4 -8
- data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
- data/lib/rubocop/cop/style/self_assignment.rb +13 -13
- data/lib/rubocop/cop/style/semicolon.rb +18 -8
- data/lib/rubocop/cop/style/send.rb +9 -0
- data/lib/rubocop/cop/style/signal_exception.rb +100 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
- data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
- data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
- data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
- data/lib/rubocop/cop/style/string_literals.rb +22 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
- data/lib/rubocop/cop/style/string_methods.rb +18 -7
- data/lib/rubocop/cop/style/symbol_array.rb +5 -9
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
- data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
- data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
- data/lib/rubocop/cop/style/unless_else.rb +15 -0
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
- data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
- data/lib/rubocop/cop/style/when_then.rb +13 -0
- data/lib/rubocop/cop/style/while_until_do.rb +26 -4
- data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
- data/lib/rubocop/cop/style/word_array.rb +4 -8
- data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
- data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
- data/lib/rubocop/cop/util.rb +42 -33
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
- data/lib/rubocop/cop/variable_force/scope.rb +1 -5
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/json_formatter.rb +9 -3
- data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
- data/lib/rubocop/node_pattern.rb +2 -3
- data/lib/rubocop/options.rb +8 -8
- data/lib/rubocop/path_util.rb +15 -3
- data/lib/rubocop/processed_source.rb +5 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/token.rb +74 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +37 -10
- data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
- data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
- data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
- data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -144,11 +144,8 @@ module RuboCop
|
|
144
144
|
|
145
145
|
def non_comment_token_line_numbers
|
146
146
|
@non_comment_token_line_numbers ||= begin
|
147
|
-
non_comment_tokens = processed_source.tokens.reject
|
148
|
-
|
149
|
-
end
|
150
|
-
|
151
|
-
non_comment_tokens.map { |token| token.pos.line }.uniq
|
147
|
+
non_comment_tokens = processed_source.tokens.reject(&:comment?)
|
148
|
+
non_comment_tokens.map(&:line).uniq
|
152
149
|
end
|
153
150
|
end
|
154
151
|
end
|
data/lib/rubocop/config.rb
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'pathname'
|
4
4
|
|
5
|
-
# rubocop:disable Metrics/ClassLength
|
6
|
-
|
7
5
|
module RuboCop
|
8
6
|
# This class represents the configuration of the RuboCop application
|
9
7
|
# and all its cops. A Config is associated with a YAML configuration
|
10
8
|
# file from which it was read. Several different Configs can be used
|
11
9
|
# during a run of the rubocop program, if files in several
|
12
10
|
# directories are inspected.
|
11
|
+
|
12
|
+
# rubocop:disable Metrics/ClassLength
|
13
13
|
class Config
|
14
14
|
include PathUtil
|
15
15
|
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
AutoCorrect StyleGuide Details].freeze
|
18
18
|
# 2.1 is the oldest officially supported Ruby version.
|
19
19
|
DEFAULT_RUBY_VERSION = 2.1
|
20
|
-
KNOWN_RUBIES = [2.1, 2.2, 2.3, 2.4].freeze
|
20
|
+
KNOWN_RUBIES = [2.1, 2.2, 2.3, 2.4, 2.5].freeze
|
21
21
|
OBSOLETE_RUBIES = { 1.9 => '0.50', 2.0 => '0.50' }.freeze
|
22
22
|
DEFAULT_RAILS_VERSION = 5.0
|
23
23
|
OBSOLETE_COPS = {
|
@@ -33,6 +33,9 @@ module RuboCop
|
|
33
33
|
'Style/SingleSpaceBeforeFirstArg' =>
|
34
34
|
'The `Style/SingleSpaceBeforeFirstArg` cop has been renamed to ' \
|
35
35
|
'`Layout/SpaceBeforeFirstArg`.',
|
36
|
+
'Lint/RescueWithoutErrorClass' =>
|
37
|
+
'The `Lint/RescueWithoutErrorClass` cop has been replaced by ' \
|
38
|
+
'`Style/RescueStandardError`.',
|
36
39
|
'Lint/SpaceBeforeFirstArg' =>
|
37
40
|
'The `Lint/SpaceBeforeFirstArg` cop has been removed, since it was a ' \
|
38
41
|
'duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
|
@@ -114,6 +117,13 @@ module RuboCop
|
|
114
117
|
alternative: 'Style/Encoding no longer supports styles. ' \
|
115
118
|
'The "never" behavior is always assumed.'
|
116
119
|
},
|
120
|
+
{
|
121
|
+
cop: 'Style/IfUnlessModifier',
|
122
|
+
parameter: 'MaxLineLength',
|
123
|
+
alternative:
|
124
|
+
'`Style/IfUnlessModifier: MaxLineLength` has been removed. Use ' \
|
125
|
+
'`Metrics/LineLength: Max` instead'
|
126
|
+
},
|
117
127
|
{
|
118
128
|
cop: 'Style/SpaceAroundOperators',
|
119
129
|
parameter: 'MultiSpaceAllowedForOperators',
|
@@ -121,6 +131,13 @@ module RuboCop
|
|
121
131
|
'for alignment, please use AllowForAlignment: ' \
|
122
132
|
'true instead.'
|
123
133
|
},
|
134
|
+
{
|
135
|
+
cop: 'Style/WhileUntilModifier',
|
136
|
+
parameter: 'MaxLineLength',
|
137
|
+
alternative:
|
138
|
+
'`Style/WhileUntilModifier: MaxLineLength` has been removed. Use ' \
|
139
|
+
'`Metrics/LineLength: Max` instead'
|
140
|
+
},
|
124
141
|
{
|
125
142
|
cop: 'AllCops',
|
126
143
|
parameter: 'RunRailsCops',
|
@@ -172,6 +189,19 @@ module RuboCop
|
|
172
189
|
@hash = hash
|
173
190
|
end
|
174
191
|
|
192
|
+
def self.create(hash, path)
|
193
|
+
new(hash, path).check
|
194
|
+
end
|
195
|
+
|
196
|
+
def check
|
197
|
+
deprecation_check do |deprecation_message|
|
198
|
+
warn("#{path} - #{deprecation_message}")
|
199
|
+
end
|
200
|
+
validate
|
201
|
+
make_excludes_absolute
|
202
|
+
self
|
203
|
+
end
|
204
|
+
|
175
205
|
def [](key)
|
176
206
|
@hash[key]
|
177
207
|
end
|
@@ -282,7 +312,7 @@ module RuboCop
|
|
282
312
|
check_target_ruby
|
283
313
|
validate_parameter_names(valid_cop_names)
|
284
314
|
validate_enforced_styles(valid_cop_names)
|
285
|
-
validate_syntax_cop
|
315
|
+
validate_syntax_cop
|
286
316
|
reject_mutually_exclusive_defaults
|
287
317
|
end
|
288
318
|
|
@@ -381,13 +411,16 @@ module RuboCop
|
|
381
411
|
end
|
382
412
|
end
|
383
413
|
|
384
|
-
def validate_syntax_cop
|
385
|
-
|
386
|
-
|
414
|
+
def validate_syntax_cop
|
415
|
+
syntax_config = self['Lint/Syntax']
|
416
|
+
default_config = ConfigLoader.default_configuration['Lint/Syntax']
|
417
|
+
|
418
|
+
return unless syntax_config &&
|
419
|
+
default_config.merge(syntax_config) != default_config
|
387
420
|
|
388
421
|
raise ValidationError,
|
389
422
|
"configuration for Syntax cop found in #{smart_loaded_path}\n" \
|
390
|
-
'
|
423
|
+
'It\'s not possible to disable this cop.'
|
391
424
|
end
|
392
425
|
|
393
426
|
def validate_section_presence(name)
|
@@ -514,4 +547,5 @@ module RuboCop
|
|
514
547
|
PathUtil.smart_path(@loaded_path)
|
515
548
|
end
|
516
549
|
end
|
550
|
+
# rubocop:enable Metrics/ClassLength
|
517
551
|
end
|
@@ -16,8 +16,6 @@ module RuboCop
|
|
16
16
|
AUTO_GENERATED_FILE = '.rubocop_todo.yml'.freeze
|
17
17
|
|
18
18
|
class << self
|
19
|
-
include ConfigLoaderResolver
|
20
|
-
|
21
19
|
attr_accessor :debug, :auto_gen_config, :ignore_parent_exclusion
|
22
20
|
attr_writer :root_level # The upwards search is stopped at this level.
|
23
21
|
attr_writer :default_configuration
|
@@ -32,36 +30,22 @@ module RuboCop
|
|
32
30
|
|
33
31
|
def load_file(file)
|
34
32
|
return if file.nil?
|
35
|
-
path = File.absolute_path(
|
36
|
-
file.is_a?(RemoteConfig) ? file.file : file
|
37
|
-
)
|
33
|
+
path = File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
|
38
34
|
|
39
35
|
hash = load_yaml_configuration(path)
|
40
36
|
|
41
37
|
# Resolve requires first in case they define additional cops
|
42
|
-
resolve_requires(path, hash)
|
38
|
+
resolver.resolve_requires(path, hash)
|
43
39
|
|
44
40
|
add_missing_namespaces(path, hash)
|
45
41
|
target_ruby_version_to_f!(hash)
|
46
42
|
|
47
|
-
resolve_inheritance_from_gems(hash, hash.delete('inherit_gem'))
|
48
|
-
resolve_inheritance(path, hash, file)
|
43
|
+
resolver.resolve_inheritance_from_gems(hash, hash.delete('inherit_gem'))
|
44
|
+
resolver.resolve_inheritance(path, hash, file)
|
49
45
|
|
50
46
|
hash.delete('inherit_from')
|
51
47
|
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
def create_config(hash, path)
|
56
|
-
config = Config.new(hash, path)
|
57
|
-
|
58
|
-
config.deprecation_check do |deprecation_message|
|
59
|
-
warn("#{path} - #{deprecation_message}")
|
60
|
-
end
|
61
|
-
|
62
|
-
config.validate
|
63
|
-
config.make_excludes_absolute
|
64
|
-
config
|
48
|
+
Config.create(hash, path)
|
65
49
|
end
|
66
50
|
|
67
51
|
# rubocop:disable Performance/HashEachMethods
|
@@ -79,36 +63,7 @@ module RuboCop
|
|
79
63
|
# with the addition that any value that is a hash, and occurs in both
|
80
64
|
# arguments, will also be merged. And so on.
|
81
65
|
def merge(base_hash, derived_hash)
|
82
|
-
|
83
|
-
keys_appearing_in_both = base_hash.keys & derived_hash.keys
|
84
|
-
keys_appearing_in_both.each do |key|
|
85
|
-
next unless base_hash[key].is_a?(Hash)
|
86
|
-
result[key] = merge(base_hash[key], derived_hash[key])
|
87
|
-
end
|
88
|
-
result
|
89
|
-
end
|
90
|
-
|
91
|
-
def base_configs(path, inherit_from, file)
|
92
|
-
configs = Array(inherit_from).compact.map do |f|
|
93
|
-
load_file(inherited_file(path, f, file))
|
94
|
-
end
|
95
|
-
|
96
|
-
configs.compact
|
97
|
-
end
|
98
|
-
|
99
|
-
def inherited_file(path, inherit_from, file)
|
100
|
-
regex = URI::DEFAULT_PARSER.make_regexp(%w[http https])
|
101
|
-
if inherit_from =~ /\A#{regex}\z/
|
102
|
-
f = RemoteConfig.new(inherit_from, File.dirname(path))
|
103
|
-
elsif file.is_a?(RemoteConfig)
|
104
|
-
f = file.inherit_from_remote(inherit_from, path)
|
105
|
-
else
|
106
|
-
f = File.expand_path(inherit_from, File.dirname(path))
|
107
|
-
|
108
|
-
return if auto_gen_config? && f.include?(AUTO_GENERATED_FILE)
|
109
|
-
print 'Inheriting ' if debug?
|
110
|
-
end
|
111
|
-
f
|
66
|
+
resolver.merge(base_hash, derived_hash)
|
112
67
|
end
|
113
68
|
|
114
69
|
# Returns the path of .rubocop.yml searching upwards in the
|
@@ -153,22 +108,7 @@ module RuboCop
|
|
153
108
|
# so that only cops explicitly disabled in user configuration are
|
154
109
|
# disabled.
|
155
110
|
def merge_with_default(config, config_file)
|
156
|
-
|
157
|
-
|
158
|
-
disabled_by_default = config.for_all_cops['DisabledByDefault']
|
159
|
-
enabled_by_default = config.for_all_cops['EnabledByDefault']
|
160
|
-
|
161
|
-
if disabled_by_default || enabled_by_default
|
162
|
-
default_configuration = transform(default_configuration) do |params|
|
163
|
-
params.merge('Enabled' => !disabled_by_default)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
if disabled_by_default
|
168
|
-
config = handle_disabled_by_default(config, default_configuration)
|
169
|
-
end
|
170
|
-
|
171
|
-
Config.new(merge(default_configuration, config), config_file)
|
111
|
+
resolver.merge_with_default(config, config_file)
|
172
112
|
end
|
173
113
|
|
174
114
|
def target_ruby_version_to_f!(hash)
|
@@ -178,40 +118,37 @@ module RuboCop
|
|
178
118
|
hash['AllCops'][version] = hash['AllCops'][version].to_f
|
179
119
|
end
|
180
120
|
|
181
|
-
|
182
|
-
|
183
|
-
def handle_disabled_by_default(config, new_default_configuration)
|
184
|
-
department_config = config.to_hash.reject { |cop| cop.include?('/') }
|
185
|
-
department_config.each do |dept, dept_params|
|
186
|
-
# Rails is always disabled by default and the department's Enabled
|
187
|
-
# flag works like the --rails command line option, which is that when
|
188
|
-
# AllCops:DisabledByDefault is true, each Rails cop must still be
|
189
|
-
# explicitly mentioned in user configuration in order to be enabled.
|
190
|
-
next if dept == 'Rails'
|
191
|
-
|
192
|
-
next unless dept_params['Enabled']
|
193
|
-
|
194
|
-
new_default_configuration.each do |cop, params|
|
195
|
-
next unless cop.start_with?(dept + '/')
|
121
|
+
def add_inheritance_from_auto_generated_file
|
122
|
+
file_string = " #{AUTO_GENERATED_FILE}"
|
196
123
|
|
197
|
-
|
198
|
-
|
199
|
-
|
124
|
+
if File.exist?(DOTFILE)
|
125
|
+
files = Array(load_yaml_configuration(DOTFILE)['inherit_from'])
|
126
|
+
return if files.include?(AUTO_GENERATED_FILE)
|
127
|
+
files.unshift(AUTO_GENERATED_FILE)
|
128
|
+
file_string = "\n - " + files.join("\n - ") if files.size > 1
|
129
|
+
rubocop_yml_contents = IO.read(DOTFILE, encoding: Encoding::UTF_8)
|
130
|
+
.sub(/^inherit_from: *[.\w]+/, '')
|
131
|
+
.sub(/^inherit_from: *(\n *- *[.\w]+)+/, '')
|
200
132
|
end
|
133
|
+
write_dotfile(file_string, rubocop_yml_contents)
|
134
|
+
puts "Added inheritance from `#{AUTO_GENERATED_FILE}` in `#{DOTFILE}`."
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
201
138
|
|
202
|
-
|
203
|
-
|
139
|
+
def write_dotfile(file_string, rubocop_yml_contents)
|
140
|
+
File.open(DOTFILE, 'w') do |f|
|
141
|
+
f.write "inherit_from:#{file_string}\n\n"
|
142
|
+
f.write rubocop_yml_contents if rubocop_yml_contents
|
204
143
|
end
|
205
144
|
end
|
206
145
|
|
207
|
-
|
208
|
-
|
209
|
-
def transform(config)
|
210
|
-
Hash[config.map { |cop, params| [cop, yield(params)] }]
|
146
|
+
def resolver
|
147
|
+
@resolver ||= ConfigLoaderResolver.new
|
211
148
|
end
|
212
149
|
|
213
150
|
def load_yaml_configuration(absolute_path)
|
214
|
-
yaml_code =
|
151
|
+
yaml_code = read_file(absolute_path)
|
215
152
|
hash = yaml_safe_load(yaml_code, absolute_path) || {}
|
216
153
|
|
217
154
|
puts "configuration from #{absolute_path}" if debug?
|
@@ -223,6 +160,16 @@ module RuboCop
|
|
223
160
|
hash
|
224
161
|
end
|
225
162
|
|
163
|
+
# Read the specified file, or exit with a friendly, concise message on
|
164
|
+
# stderr. Care is taken to use the standard OS exit code for a "file not
|
165
|
+
# found" error.
|
166
|
+
def read_file(absolute_path)
|
167
|
+
IO.read(absolute_path, encoding: Encoding::UTF_8)
|
168
|
+
rescue Errno::ENOENT
|
169
|
+
warn(format('Configuration file not found: %s', absolute_path))
|
170
|
+
exit(Errno::ENOENT::Errno)
|
171
|
+
end
|
172
|
+
|
226
173
|
def yaml_safe_load(yaml_code, filename)
|
227
174
|
if YAML.respond_to?(:safe_load) # Ruby 2.1+
|
228
175
|
if defined?(SafeYAML) && SafeYAML.respond_to?(:load)
|
@@ -236,14 +183,6 @@ module RuboCop
|
|
236
183
|
end
|
237
184
|
end
|
238
185
|
|
239
|
-
def gem_config_path(gem_name, relative_config_path)
|
240
|
-
spec = Gem::Specification.find_by_name(gem_name)
|
241
|
-
return File.join(spec.gem_dir, relative_config_path)
|
242
|
-
rescue Gem::LoadError => e
|
243
|
-
raise Gem::LoadError,
|
244
|
-
"Unable to find gem #{gem_name}; is the gem installed? #{e}"
|
245
|
-
end
|
246
|
-
|
247
186
|
def config_files_in_path(target)
|
248
187
|
possible_config_files = dirs_to_search(target).map do |dir|
|
249
188
|
File.join(dir, DOTFILE)
|
@@ -4,8 +4,8 @@ require 'yaml'
|
|
4
4
|
require 'pathname'
|
5
5
|
|
6
6
|
module RuboCop
|
7
|
-
# A
|
8
|
-
|
7
|
+
# A help class for ConfigLoader that handles configuration resolution.
|
8
|
+
class ConfigLoaderResolver
|
9
9
|
def resolve_requires(path, hash)
|
10
10
|
config_dir = File.dirname(path)
|
11
11
|
Array(hash.delete('require')).each do |r|
|
@@ -40,5 +40,102 @@ module RuboCop
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
# Merges the given configuration with the default one. If
|
45
|
+
# AllCops:DisabledByDefault is true, it changes the Enabled params so that
|
46
|
+
# only cops from user configuration are enabled. If
|
47
|
+
# AllCops::EnabledByDefault is true, it changes the Enabled params so that
|
48
|
+
# only cops explicitly disabled in user configuration are disabled.
|
49
|
+
def merge_with_default(config, config_file)
|
50
|
+
default_configuration = ConfigLoader.default_configuration
|
51
|
+
|
52
|
+
disabled_by_default = config.for_all_cops['DisabledByDefault']
|
53
|
+
enabled_by_default = config.for_all_cops['EnabledByDefault']
|
54
|
+
|
55
|
+
if disabled_by_default || enabled_by_default
|
56
|
+
default_configuration = transform(default_configuration) do |params|
|
57
|
+
params.merge('Enabled' => !disabled_by_default)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
if disabled_by_default
|
62
|
+
config = handle_disabled_by_default(config, default_configuration)
|
63
|
+
end
|
64
|
+
|
65
|
+
Config.new(merge(default_configuration, config), config_file)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns a new hash where the parameters of the given config hash have
|
69
|
+
# been replaced by parameters returned by the given block.
|
70
|
+
# Return a recursive merge of two hashes. That is, a normal hash merge,
|
71
|
+
# with the addition that any value that is a hash, and occurs in both
|
72
|
+
# arguments, will also be merged. And so on.
|
73
|
+
def merge(base_hash, derived_hash)
|
74
|
+
result = base_hash.merge(derived_hash)
|
75
|
+
keys_appearing_in_both = base_hash.keys & derived_hash.keys
|
76
|
+
keys_appearing_in_both.each do |key|
|
77
|
+
next unless base_hash[key].is_a?(Hash)
|
78
|
+
result[key] = merge(base_hash[key], derived_hash[key])
|
79
|
+
end
|
80
|
+
result
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def base_configs(path, inherit_from, file)
|
86
|
+
configs = Array(inherit_from).compact.map do |f|
|
87
|
+
ConfigLoader.load_file(inherited_file(path, f, file))
|
88
|
+
end
|
89
|
+
|
90
|
+
configs.compact
|
91
|
+
end
|
92
|
+
|
93
|
+
def inherited_file(path, inherit_from, file)
|
94
|
+
regex = URI::DEFAULT_PARSER.make_regexp(%w[http https])
|
95
|
+
if inherit_from =~ /\A#{regex}\z/
|
96
|
+
RemoteConfig.new(inherit_from, File.dirname(path))
|
97
|
+
elsif file.is_a?(RemoteConfig)
|
98
|
+
file.inherit_from_remote(inherit_from, path)
|
99
|
+
else
|
100
|
+
print 'Inheriting ' if ConfigLoader.debug?
|
101
|
+
File.expand_path(inherit_from, File.dirname(path))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def handle_disabled_by_default(config, new_default_configuration)
|
106
|
+
department_config = config.to_hash.reject { |cop| cop.include?('/') }
|
107
|
+
department_config.each do |dept, dept_params|
|
108
|
+
# Rails is always disabled by default and the department's Enabled flag
|
109
|
+
# works like the --rails command line option, which is that when
|
110
|
+
# AllCops:DisabledByDefault is true, each Rails cop must still be
|
111
|
+
# explicitly mentioned in user configuration in order to be enabled.
|
112
|
+
next if dept == 'Rails'
|
113
|
+
|
114
|
+
next unless dept_params['Enabled']
|
115
|
+
|
116
|
+
new_default_configuration.each do |cop, params|
|
117
|
+
next unless cop.start_with?(dept + '/')
|
118
|
+
|
119
|
+
# Retain original default configuration for cops in the department.
|
120
|
+
params['Enabled'] = ConfigLoader.default_configuration[cop]['Enabled']
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
transform(config) do |params|
|
125
|
+
{ 'Enabled' => true }.merge(params) # Set true if not set.
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def transform(config)
|
130
|
+
Hash[config.map { |cop, params| [cop, yield(params)] }]
|
131
|
+
end
|
132
|
+
|
133
|
+
def gem_config_path(gem_name, relative_config_path)
|
134
|
+
spec = Gem::Specification.find_by_name(gem_name)
|
135
|
+
return File.join(spec.gem_dir, relative_config_path)
|
136
|
+
rescue Gem::LoadError => e
|
137
|
+
raise Gem::LoadError,
|
138
|
+
"Unable to find gem #{gem_name}; is the gem installed? #{e}"
|
139
|
+
end
|
43
140
|
end
|
44
141
|
end
|