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
data/lib/rubocop.rb
CHANGED
@@ -1,74 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'parser'
|
4
3
|
require 'rainbow'
|
5
4
|
|
6
5
|
require 'English'
|
7
6
|
require 'set'
|
8
7
|
require 'forwardable'
|
8
|
+
require 'regexp_parser'
|
9
9
|
require 'unicode/display_width/no_string_ext'
|
10
|
+
require 'rubocop-ast'
|
11
|
+
require_relative 'rubocop/ast_aliases'
|
10
12
|
|
11
13
|
require_relative 'rubocop/version'
|
12
14
|
|
13
15
|
require_relative 'rubocop/core_ext/string'
|
16
|
+
require_relative 'rubocop/ext/processed_source'
|
17
|
+
|
14
18
|
require_relative 'rubocop/path_util'
|
15
19
|
require_relative 'rubocop/file_finder'
|
16
20
|
require_relative 'rubocop/platform'
|
17
|
-
require_relative 'rubocop/string_util'
|
18
21
|
require_relative 'rubocop/name_similarity'
|
19
|
-
require_relative 'rubocop/node_pattern'
|
20
22
|
require_relative 'rubocop/string_interpreter'
|
21
|
-
require_relative 'rubocop/ast/sexp'
|
22
|
-
require_relative 'rubocop/ast/node'
|
23
|
-
require_relative 'rubocop/ast/node/mixin/method_identifier_predicates'
|
24
|
-
require_relative 'rubocop/ast/node/mixin/binary_operator_node'
|
25
|
-
require_relative 'rubocop/ast/node/mixin/collection_node'
|
26
|
-
require_relative 'rubocop/ast/node/mixin/conditional_node'
|
27
|
-
require_relative 'rubocop/ast/node/mixin/hash_element_node'
|
28
|
-
require_relative 'rubocop/ast/node/mixin/method_dispatch_node'
|
29
|
-
require_relative 'rubocop/ast/node/mixin/modifier_node'
|
30
|
-
require_relative 'rubocop/ast/node/mixin/numeric_node'
|
31
|
-
require_relative 'rubocop/ast/node/mixin/parameterized_node'
|
32
|
-
require_relative 'rubocop/ast/node/mixin/predicate_operator_node'
|
33
|
-
require_relative 'rubocop/ast/node/mixin/basic_literal_node'
|
34
|
-
require_relative 'rubocop/ast/node/alias_node'
|
35
|
-
require_relative 'rubocop/ast/node/and_node'
|
36
|
-
require_relative 'rubocop/ast/node/args_node'
|
37
|
-
require_relative 'rubocop/ast/node/array_node'
|
38
|
-
require_relative 'rubocop/ast/node/block_node'
|
39
|
-
require_relative 'rubocop/ast/node/break_node'
|
40
|
-
require_relative 'rubocop/ast/node/case_match_node'
|
41
|
-
require_relative 'rubocop/ast/node/case_node'
|
42
|
-
require_relative 'rubocop/ast/node/class_node'
|
43
|
-
require_relative 'rubocop/ast/node/def_node'
|
44
|
-
require_relative 'rubocop/ast/node/defined_node'
|
45
|
-
require_relative 'rubocop/ast/node/ensure_node'
|
46
|
-
require_relative 'rubocop/ast/node/for_node'
|
47
|
-
require_relative 'rubocop/ast/node/forward_args_node'
|
48
|
-
require_relative 'rubocop/ast/node/float_node'
|
49
|
-
require_relative 'rubocop/ast/node/hash_node'
|
50
|
-
require_relative 'rubocop/ast/node/if_node'
|
51
|
-
require_relative 'rubocop/ast/node/int_node'
|
52
|
-
require_relative 'rubocop/ast/node/keyword_splat_node'
|
53
|
-
require_relative 'rubocop/ast/node/module_node'
|
54
|
-
require_relative 'rubocop/ast/node/or_node'
|
55
|
-
require_relative 'rubocop/ast/node/pair_node'
|
56
|
-
require_relative 'rubocop/ast/node/range_node'
|
57
|
-
require_relative 'rubocop/ast/node/regexp_node'
|
58
|
-
require_relative 'rubocop/ast/node/resbody_node'
|
59
|
-
require_relative 'rubocop/ast/node/retry_node'
|
60
|
-
require_relative 'rubocop/ast/node/return_node'
|
61
|
-
require_relative 'rubocop/ast/node/self_class_node'
|
62
|
-
require_relative 'rubocop/ast/node/send_node'
|
63
|
-
require_relative 'rubocop/ast/node/str_node'
|
64
|
-
require_relative 'rubocop/ast/node/super_node'
|
65
|
-
require_relative 'rubocop/ast/node/symbol_node'
|
66
|
-
require_relative 'rubocop/ast/node/until_node'
|
67
|
-
require_relative 'rubocop/ast/node/when_node'
|
68
|
-
require_relative 'rubocop/ast/node/while_node'
|
69
|
-
require_relative 'rubocop/ast/node/yield_node'
|
70
|
-
require_relative 'rubocop/ast/builder'
|
71
|
-
require_relative 'rubocop/ast/traversal'
|
72
23
|
require_relative 'rubocop/error'
|
73
24
|
require_relative 'rubocop/warning'
|
74
25
|
|
@@ -147,6 +98,7 @@ require_relative 'rubocop/cop/mixin/percent_literal'
|
|
147
98
|
require_relative 'rubocop/cop/mixin/preceding_following_alignment'
|
148
99
|
require_relative 'rubocop/cop/mixin/preferred_delimiters'
|
149
100
|
require_relative 'rubocop/cop/mixin/rational_literal'
|
101
|
+
require_relative 'rubocop/cop/mixin/regexp_literal_help'
|
150
102
|
require_relative 'rubocop/cop/mixin/rescue_node'
|
151
103
|
require_relative 'rubocop/cop/mixin/safe_assignment'
|
152
104
|
require_relative 'rubocop/cop/mixin/space_after_punctuation'
|
@@ -213,10 +165,11 @@ require_relative 'rubocop/cop/layout/empty_line_after_magic_comment'
|
|
213
165
|
require_relative 'rubocop/cop/layout/empty_line_between_defs'
|
214
166
|
require_relative 'rubocop/cop/layout/empty_lines_around_access_modifier'
|
215
167
|
require_relative 'rubocop/cop/layout/empty_lines_around_arguments'
|
168
|
+
require_relative 'rubocop/cop/layout/empty_lines_around_attribute_accessor'
|
216
169
|
require_relative 'rubocop/cop/layout/empty_lines_around_begin_body'
|
217
170
|
require_relative 'rubocop/cop/layout/empty_lines_around_block_body'
|
218
171
|
require_relative 'rubocop/cop/layout/empty_lines_around_class_body'
|
219
|
-
require_relative 'rubocop/cop/layout/empty_lines_around_exception_handling_keywords'
|
172
|
+
require_relative 'rubocop/cop/layout/empty_lines_around_exception_handling_keywords'
|
220
173
|
require_relative 'rubocop/cop/layout/empty_lines_around_method_body'
|
221
174
|
require_relative 'rubocop/cop/layout/empty_lines_around_module_body'
|
222
175
|
require_relative 'rubocop/cop/layout/empty_lines'
|
@@ -289,8 +242,10 @@ require_relative 'rubocop/cop/lint/assignment_in_condition'
|
|
289
242
|
require_relative 'rubocop/cop/lint/big_decimal_new'
|
290
243
|
require_relative 'rubocop/cop/lint/boolean_symbol'
|
291
244
|
require_relative 'rubocop/cop/lint/circular_argument_reference'
|
245
|
+
require_relative 'rubocop/cop/lint/constant_resolution'
|
292
246
|
require_relative 'rubocop/cop/lint/debugger'
|
293
247
|
require_relative 'rubocop/cop/lint/deprecated_class_methods'
|
248
|
+
require_relative 'rubocop/cop/lint/deprecated_open_ssl_constant'
|
294
249
|
require_relative 'rubocop/cop/lint/disjunctive_assignment_in_constructor'
|
295
250
|
require_relative 'rubocop/cop/lint/duplicate_case_condition'
|
296
251
|
require_relative 'rubocop/cop/lint/duplicate_hash_key'
|
@@ -315,6 +270,7 @@ require_relative 'rubocop/cop/lint/literal_as_condition'
|
|
315
270
|
require_relative 'rubocop/cop/lint/literal_in_interpolation'
|
316
271
|
require_relative 'rubocop/cop/lint/loop'
|
317
272
|
require_relative 'rubocop/cop/lint/missing_cop_enable_directive'
|
273
|
+
require_relative 'rubocop/cop/lint/mixed_regexp_capture_types'
|
318
274
|
require_relative 'rubocop/cop/lint/multiple_comparison'
|
319
275
|
require_relative 'rubocop/cop/lint/nested_method_definition'
|
320
276
|
require_relative 'rubocop/cop/lint/nested_percent_literal'
|
@@ -366,6 +322,7 @@ require_relative 'rubocop/cop/lint/useless_else_without_rescue'
|
|
366
322
|
require_relative 'rubocop/cop/lint/useless_setter_call'
|
367
323
|
require_relative 'rubocop/cop/lint/void'
|
368
324
|
|
325
|
+
require_relative 'rubocop/cop/metrics/utils/iterating_block'
|
369
326
|
require_relative 'rubocop/cop/metrics/cyclomatic_complexity'
|
370
327
|
# relies on cyclomatic_complexity
|
371
328
|
require_relative 'rubocop/cop/metrics/utils/abc_size_calculator'
|
@@ -468,11 +425,10 @@ require_relative 'rubocop/cop/style/lambda'
|
|
468
425
|
require_relative 'rubocop/cop/style/lambda_call'
|
469
426
|
require_relative 'rubocop/cop/style/line_end_concatenation'
|
470
427
|
require_relative 'rubocop/cop/style/method_call_without_args_parentheses'
|
471
|
-
# rubocop:disable Layout/LineLength
|
472
428
|
require_relative 'rubocop/cop/style/method_call_with_args_parentheses'
|
429
|
+
require_relative 'rubocop/cop/style/redundant_fetch_block'
|
473
430
|
require_relative 'rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses'
|
474
431
|
require_relative 'rubocop/cop/style/method_call_with_args_parentheses/require_parentheses'
|
475
|
-
# rubocop:enable Layout/LineLength
|
476
432
|
require_relative 'rubocop/cop/style/method_called_on_do_end_block'
|
477
433
|
require_relative 'rubocop/cop/style/method_def_parentheses'
|
478
434
|
require_relative 'rubocop/cop/style/method_missing_super'
|
@@ -526,6 +482,8 @@ require_relative 'rubocop/cop/style/redundant_freeze'
|
|
526
482
|
require_relative 'rubocop/cop/style/redundant_interpolation'
|
527
483
|
require_relative 'rubocop/cop/style/redundant_parentheses'
|
528
484
|
require_relative 'rubocop/cop/style/redundant_percent_q'
|
485
|
+
require_relative 'rubocop/cop/style/redundant_regexp_character_class'
|
486
|
+
require_relative 'rubocop/cop/style/redundant_regexp_escape'
|
529
487
|
require_relative 'rubocop/cop/style/redundant_return'
|
530
488
|
require_relative 'rubocop/cop/style/redundant_self'
|
531
489
|
require_relative 'rubocop/cop/style/redundant_sort'
|
@@ -542,6 +500,7 @@ require_relative 'rubocop/cop/style/send'
|
|
542
500
|
require_relative 'rubocop/cop/style/signal_exception'
|
543
501
|
require_relative 'rubocop/cop/style/single_line_block_params'
|
544
502
|
require_relative 'rubocop/cop/style/single_line_methods'
|
503
|
+
require_relative 'rubocop/cop/style/slicing_with_range'
|
545
504
|
require_relative 'rubocop/cop/style/special_global_vars'
|
546
505
|
require_relative 'rubocop/cop/style/stabby_lambda_parentheses'
|
547
506
|
require_relative 'rubocop/cop/style/stderr_puts'
|
@@ -613,10 +572,8 @@ require_relative 'rubocop/config_obsoletion'
|
|
613
572
|
require_relative 'rubocop/config_store'
|
614
573
|
require_relative 'rubocop/config_validator'
|
615
574
|
require_relative 'rubocop/target_finder'
|
616
|
-
require_relative 'rubocop/token'
|
617
575
|
require_relative 'rubocop/comment_config'
|
618
576
|
require_relative 'rubocop/magic_comment'
|
619
|
-
require_relative 'rubocop/processed_source'
|
620
577
|
require_relative 'rubocop/result_cache'
|
621
578
|
require_relative 'rubocop/runner'
|
622
579
|
require_relative 'rubocop/cli'
|
data/lib/rubocop/cli.rb
CHANGED
@@ -35,8 +35,8 @@ module RuboCop
|
|
35
35
|
if @options[:init]
|
36
36
|
run_command(:init)
|
37
37
|
else
|
38
|
-
validate_options_vs_config
|
39
38
|
act_on_options
|
39
|
+
validate_options_vs_config
|
40
40
|
apply_default_formatter
|
41
41
|
execute_runners
|
42
42
|
end
|
@@ -75,7 +75,7 @@ module RuboCop
|
|
75
75
|
|
76
76
|
def validate_options_vs_config
|
77
77
|
if @options[:parallel] &&
|
78
|
-
!@config_store.
|
78
|
+
!@config_store.for_dir(Dir.pwd).for_all_cops['UseCache']
|
79
79
|
raise OptionArgumentError, '-P/--parallel uses caching to speed up ' \
|
80
80
|
'execution, so combining with AllCops: ' \
|
81
81
|
'UseCache: false is not allowed.'
|
@@ -123,7 +123,7 @@ module RuboCop
|
|
123
123
|
if @options[:auto_gen_config]
|
124
124
|
formatter = 'autogenconf'
|
125
125
|
else
|
126
|
-
cfg = @config_store.
|
126
|
+
cfg = @config_store.for_dir(Dir.pwd).for_all_cops
|
127
127
|
formatter = cfg['DefaultFormatter'] || 'progress'
|
128
128
|
end
|
129
129
|
[[formatter, @options[:output_path]]]
|
@@ -25,10 +25,10 @@ module RuboCop
|
|
25
25
|
private
|
26
26
|
|
27
27
|
def maybe_run_line_length_cop
|
28
|
-
if !line_length_enabled?(@config_store.
|
28
|
+
if !line_length_enabled?(@config_store.for_dir(Dir.pwd))
|
29
29
|
skip_line_length_cop(PHASE_1_DISABLED)
|
30
30
|
elsif !same_max_line_length?(
|
31
|
-
@config_store.
|
31
|
+
@config_store.for_dir(Dir.pwd), ConfigLoader.default_configuration
|
32
32
|
)
|
33
33
|
skip_line_length_cop(PHASE_1_OVERRIDDEN)
|
34
34
|
else
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
27
27
|
# RuboCop will start looking for the configuration file in the directory
|
28
28
|
# where the inspected file is and continue its way up to the root directory.
|
29
29
|
#
|
30
|
-
# See https://
|
30
|
+
# See https://docs.rubocop.org/rubocop/configuration
|
31
31
|
DESC
|
32
32
|
|
33
33
|
File.open(DOTFILE, 'w') do |f|
|
@@ -42,18 +42,14 @@ module RuboCop
|
|
42
42
|
selected_cops_of_department(registry, department)
|
43
43
|
end
|
44
44
|
|
45
|
-
if show_all
|
46
|
-
puts "# Department '#{department}' (#{selected_cops.length}):"
|
47
|
-
end
|
45
|
+
puts "# Department '#{department}' (#{selected_cops.length}):" if show_all
|
48
46
|
|
49
47
|
print_cop_details(selected_cops)
|
50
48
|
end
|
51
49
|
|
52
50
|
def print_cop_details(cops)
|
53
51
|
cops.each do |cop|
|
54
|
-
if cop.new(@config).support_autocorrect?
|
55
|
-
puts '# Supports --auto-correct'
|
56
|
-
end
|
52
|
+
puts '# Supports --auto-correct' if cop.new(@config).support_autocorrect?
|
57
53
|
puts "#{cop.cop_name}:"
|
58
54
|
puts config_lines(cop)
|
59
55
|
puts
|
data/lib/rubocop/config.rb
CHANGED
@@ -152,7 +152,7 @@ module RuboCop
|
|
152
152
|
return true if File.extname(file) == '.gemspec'
|
153
153
|
|
154
154
|
file_to_include?(file) do |pattern, relative_path, absolute_path|
|
155
|
-
|
155
|
+
/[A-Z]/.match?(pattern.to_s) &&
|
156
156
|
(match_path?(pattern, relative_path) ||
|
157
157
|
match_path?(pattern, absolute_path))
|
158
158
|
end
|
@@ -261,9 +261,13 @@ module RuboCop
|
|
261
261
|
|
262
262
|
def enable_cop?(qualified_cop_name, cop_options)
|
263
263
|
department = department_of(qualified_cop_name)
|
264
|
+
cop_enabled = cop_options.fetch('Enabled') do
|
265
|
+
!for_all_cops['DisabledByDefault']
|
266
|
+
end
|
267
|
+
return true if cop_enabled == 'override_department'
|
264
268
|
return false if department && department['Enabled'] == false
|
265
269
|
|
266
|
-
|
270
|
+
cop_enabled
|
267
271
|
end
|
268
272
|
|
269
273
|
def department_of(qualified_cop_name)
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
36
36
|
FileFinder.root_level = nil
|
37
37
|
end
|
38
38
|
|
39
|
-
def load_file(file)
|
39
|
+
def load_file(file) # rubocop:disable Metrics/AbcSize
|
40
40
|
path = File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
|
41
41
|
|
42
42
|
hash = load_yaml_configuration(path)
|
@@ -46,6 +46,7 @@ module RuboCop
|
|
46
46
|
|
47
47
|
add_missing_namespaces(path, hash)
|
48
48
|
|
49
|
+
resolver.override_department_setting_for_cops({}, hash)
|
49
50
|
resolver.resolve_inheritance_from_gems(hash)
|
50
51
|
resolver.resolve_inheritance(path, hash, file, debug?)
|
51
52
|
|
@@ -94,9 +95,7 @@ module RuboCop
|
|
94
95
|
end
|
95
96
|
|
96
97
|
merge_with_default(config, config_file).tap do |merged_config|
|
97
|
-
unless possible_new_cops?(config)
|
98
|
-
warn_on_pending_cops(merged_config.pending_cops)
|
99
|
-
end
|
98
|
+
warn_on_pending_cops(merged_config.pending_cops) unless possible_new_cops?(config)
|
100
99
|
end
|
101
100
|
end
|
102
101
|
|
@@ -132,12 +131,12 @@ module RuboCop
|
|
132
131
|
'`false` in your `.rubocop.yml` file:').yellow
|
133
132
|
|
134
133
|
pending_cops.each do |cop|
|
135
|
-
|
136
|
-
|
137
|
-
).yellow
|
134
|
+
version = cop.metadata['VersionAdded'] || 'N/A'
|
135
|
+
|
136
|
+
warn Rainbow(" - #{cop.name} (#{version})").yellow
|
138
137
|
end
|
139
138
|
|
140
|
-
warn Rainbow('For more information: https://docs.rubocop.org/
|
139
|
+
warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
|
141
140
|
end
|
142
141
|
|
143
142
|
# Merges the given configuration with the default one. If
|
@@ -206,9 +205,7 @@ module RuboCop
|
|
206
205
|
def write_config_file(file_name, file_string, rubocop_yml_contents)
|
207
206
|
File.open(file_name, 'w') do |f|
|
208
207
|
f.write "inherit_from:#{file_string}\n"
|
209
|
-
if /\S/.match?(rubocop_yml_contents)
|
210
|
-
f.write "\n#{rubocop_yml_contents}"
|
211
|
-
end
|
208
|
+
f.write "\n#{rubocop_yml_contents}" if /\S/.match?(rubocop_yml_contents)
|
212
209
|
end
|
213
210
|
end
|
214
211
|
|
@@ -217,15 +214,16 @@ module RuboCop
|
|
217
214
|
end
|
218
215
|
|
219
216
|
def load_yaml_configuration(absolute_path)
|
220
|
-
|
217
|
+
file_contents = read_file(absolute_path)
|
218
|
+
yaml_code = Dir.chdir(File.dirname(absolute_path)) do
|
219
|
+
ERB.new(file_contents).result
|
220
|
+
end
|
221
221
|
check_duplication(yaml_code, absolute_path)
|
222
222
|
hash = yaml_safe_load(yaml_code, absolute_path) || {}
|
223
223
|
|
224
224
|
puts "configuration from #{absolute_path}" if debug?
|
225
225
|
|
226
|
-
unless hash.is_a?(Hash)
|
227
|
-
raise(TypeError, "Malformed configuration in #{absolute_path}")
|
228
|
-
end
|
226
|
+
raise(TypeError, "Malformed configuration in #{absolute_path}") unless hash.is_a?(Hash)
|
229
227
|
|
230
228
|
hash
|
231
229
|
end
|
@@ -241,8 +239,7 @@ module RuboCop
|
|
241
239
|
"#{smart_path}:#{line1}: " \
|
242
240
|
"`#{value}` is concealed by line #{line2}"
|
243
241
|
else
|
244
|
-
"#{smart_path}: "
|
245
|
-
"`#{value}` is concealed by duplicate"
|
242
|
+
"#{smart_path}: `#{value}` is concealed by duplicate"
|
246
243
|
end
|
247
244
|
warn Rainbow(message).yellow
|
248
245
|
end
|
@@ -263,13 +260,11 @@ module RuboCop
|
|
263
260
|
SafeYAML.load(yaml_code, filename, whitelisted_tags: %w[!ruby/regexp])
|
264
261
|
# Ruby 2.6+
|
265
262
|
elsif Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0')
|
266
|
-
YAML.safe_load(
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
filename: filename
|
272
|
-
)
|
263
|
+
YAML.safe_load(yaml_code,
|
264
|
+
permitted_classes: [Regexp, Symbol],
|
265
|
+
permitted_symbols: [],
|
266
|
+
aliases: true,
|
267
|
+
filename: filename)
|
273
268
|
else
|
274
269
|
YAML.safe_load(yaml_code, [Regexp, Symbol], [], true, filename)
|
275
270
|
end
|
@@ -17,10 +17,12 @@ module RuboCop
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
# rubocop:disable Metrics/MethodLength
|
20
21
|
def resolve_inheritance(path, hash, file, debug)
|
21
22
|
inherited_files = Array(hash['inherit_from'])
|
22
23
|
base_configs(path, inherited_files, file)
|
23
24
|
.reverse.each_with_index do |base_config, index|
|
25
|
+
override_department_setting_for_cops(base_config, hash)
|
24
26
|
base_config.each do |k, v|
|
25
27
|
next unless v.is_a?(Hash)
|
26
28
|
|
@@ -34,6 +36,7 @@ module RuboCop
|
|
34
36
|
end
|
35
37
|
end
|
36
38
|
end
|
39
|
+
# rubocop:enable Metrics/MethodLength
|
37
40
|
|
38
41
|
def resolve_inheritance_from_gems(hash)
|
39
42
|
gems = hash.delete('inherit_gem')
|
@@ -68,9 +71,7 @@ module RuboCop
|
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
71
|
-
if disabled_by_default
|
72
|
-
config = handle_disabled_by_default(config, default_configuration)
|
73
|
-
end
|
74
|
+
config = handle_disabled_by_default(config, default_configuration) if disabled_by_default
|
74
75
|
|
75
76
|
opts = { inherit_mode: config['inherit_mode'] || {},
|
76
77
|
unset_nil: unset_nil }
|
@@ -100,8 +101,30 @@ module RuboCop
|
|
100
101
|
end
|
101
102
|
# rubocop:enable Metrics/AbcSize
|
102
103
|
|
104
|
+
# An `Enabled: true` setting in user configuration for a cop overrides an
|
105
|
+
# `Enabled: false` setting for its department.
|
106
|
+
def override_department_setting_for_cops(base_hash, derived_hash)
|
107
|
+
derived_hash.each_key do |key|
|
108
|
+
next unless key =~ %r{(.*)/.*}
|
109
|
+
|
110
|
+
department = Regexp.last_match(1)
|
111
|
+
next unless disabled?(derived_hash, department) ||
|
112
|
+
disabled?(base_hash, department)
|
113
|
+
|
114
|
+
# The `override_department` setting for the `Enabled` parameter is an
|
115
|
+
# internal setting that's not documented in the manual. It will cause a
|
116
|
+
# cop to be enabled later, when logic surrounding enabled/disabled it
|
117
|
+
# run, even though its department is disabled.
|
118
|
+
derived_hash[key]['Enabled'] = 'override_department' if derived_hash[key]['Enabled']
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
103
122
|
private
|
104
123
|
|
124
|
+
def disabled?(hash, department)
|
125
|
+
hash[department] && hash[department]['Enabled'] == false
|
126
|
+
end
|
127
|
+
|
105
128
|
def duplicate_setting?(base_hash, derived_hash, key, inherited_file)
|
106
129
|
return false if inherited_file.nil? # Not inheritance resolving merge
|
107
130
|
return false if inherited_file.start_with?('..') # Legitimate override
|
@@ -148,10 +171,20 @@ module RuboCop
|
|
148
171
|
|
149
172
|
def inherited_file(path, inherit_from, file)
|
150
173
|
if remote_file?(inherit_from)
|
174
|
+
# A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
|
151
175
|
RemoteConfig.new(inherit_from, File.dirname(path))
|
176
|
+
elsif Pathname.new(inherit_from).absolute?
|
177
|
+
# An absolute path to a config, e.g. `inherit_from: /Users/me/rubocop.yml`.
|
178
|
+
# The path may come from `inherit_gem` option, where a gem name is expanded
|
179
|
+
# to an absolute path to that gem.
|
180
|
+
print 'Inheriting ' if ConfigLoader.debug?
|
181
|
+
inherit_from
|
152
182
|
elsif file.is_a?(RemoteConfig)
|
183
|
+
# A path relative to a URL, e.g. `inherit_from: configs/default.yml`
|
184
|
+
# in a config included with `inherit_from: http://example.com/rubocop.yml`
|
153
185
|
file.inherit_from_remote(inherit_from, path)
|
154
186
|
else
|
187
|
+
# A local relative path, e.g. `inherit_from: default.yml`
|
155
188
|
print 'Inheriting ' if ConfigLoader.debug?
|
156
189
|
File.expand_path(inherit_from, File.dirname(path))
|
157
190
|
end
|
@@ -159,7 +192,7 @@ module RuboCop
|
|
159
192
|
|
160
193
|
def remote_file?(uri)
|
161
194
|
regex = URI::DEFAULT_PARSER.make_regexp(%w[http https])
|
162
|
-
|
195
|
+
/\A#{regex}\z/.match?(uri)
|
163
196
|
end
|
164
197
|
|
165
198
|
def handle_disabled_by_default(config, new_default_configuration)
|
@@ -185,8 +218,14 @@ module RuboCop
|
|
185
218
|
end
|
186
219
|
|
187
220
|
def gem_config_path(gem_name, relative_config_path)
|
188
|
-
|
189
|
-
|
221
|
+
if defined?(Bundler)
|
222
|
+
gem = Bundler.load.specs[gem_name].first
|
223
|
+
gem_path = gem.full_gem_path if gem
|
224
|
+
end
|
225
|
+
|
226
|
+
gem_path ||= Gem::Specification.find_by_name(gem_name).gem_dir
|
227
|
+
|
228
|
+
File.join(gem_path, relative_config_path)
|
190
229
|
rescue Gem::LoadError => e
|
191
230
|
raise Gem::LoadError,
|
192
231
|
"Unable to find gem #{gem_name}; is the gem installed? #{e}"
|