rubocop 1.18.1 → 1.22.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +116 -23
- data/lib/rubocop/cli.rb +18 -0
- data/lib/rubocop/config.rb +5 -0
- data/lib/rubocop/config_loader.rb +5 -3
- data/lib/rubocop/config_loader_resolver.rb +22 -7
- data/lib/rubocop/config_validator.rb +27 -6
- data/lib/rubocop/cop/base.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_comment.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_filename.rb +103 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +45 -21
- data/lib/rubocop/cop/bundler/ordered_gems.rb +3 -12
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +11 -10
- data/lib/rubocop/cop/correctors/require_library_corrector.rb +23 -0
- data/lib/rubocop/cop/documentation.rb +1 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -12
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +31 -24
- data/lib/rubocop/cop/generator.rb +14 -8
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +60 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +71 -0
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
- data/lib/rubocop/cop/layout/class_structure.rb +7 -2
- data/lib/rubocop/cop/layout/dot_position.rb +34 -5
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +9 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -4
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +22 -18
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +0 -7
- data/lib/rubocop/cop/layout/indentation_style.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +36 -17
- data/lib/rubocop/cop/layout/line_length.rb +9 -7
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -3
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +23 -10
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +15 -4
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -0
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_parens.rb +78 -32
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +24 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +111 -0
- data/lib/rubocop/cop/lint/ambiguous_range.rb +105 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +5 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -5
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +18 -5
- data/lib/rubocop/cop/lint/boolean_symbol.rb +5 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
- data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -2
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +8 -5
- data/lib/rubocop/cop/lint/else_layout.rb +10 -6
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +12 -3
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +67 -0
- data/lib/rubocop/cop/lint/interpolation_check.rb +5 -0
- data/lib/rubocop/cop/lint/loop.rb +4 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +5 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +12 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +4 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +10 -0
- data/lib/rubocop/cop/lint/raise_exception.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +5 -4
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +50 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +7 -4
- data/lib/rubocop/cop/lint/useless_times.rb +5 -4
- data/lib/rubocop/cop/metrics/abc_size.rb +6 -0
- data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +57 -34
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +5 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -2
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -4
- data/lib/rubocop/cop/mixin/heredoc.rb +5 -0
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -2
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +9 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +18 -7
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +9 -1
- data/lib/rubocop/cop/mixin/require_library.rb +59 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -2
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
- data/lib/rubocop/cop/mixin/string_literals_help.rb +5 -1
- data/lib/rubocop/cop/mixin/trailing_body.rb +1 -1
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +0 -3
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +27 -10
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +5 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +7 -0
- data/lib/rubocop/cop/security/io_methods.rb +49 -0
- data/lib/rubocop/cop/security/json_load.rb +8 -7
- data/lib/rubocop/cop/security/open.rb +4 -0
- data/lib/rubocop/cop/security/yaml_load.rb +4 -0
- data/lib/rubocop/cop/style/accessor_grouping.rb +2 -2
- data/lib/rubocop/cop/style/and_or.rb +5 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +13 -2
- data/lib/rubocop/cop/style/array_coercion.rb +21 -3
- data/lib/rubocop/cop/style/ascii_comments.rb +0 -3
- data/lib/rubocop/cop/style/block_delimiters.rb +50 -2
- data/lib/rubocop/cop/style/case_equality.rb +6 -9
- data/lib/rubocop/cop/style/case_like_if.rb +5 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +9 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -5
- data/lib/rubocop/cop/style/collection_methods.rb +8 -6
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +55 -25
- data/lib/rubocop/cop/style/commented_keyword.rb +9 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +19 -5
- data/lib/rubocop/cop/style/date_time.rb +5 -0
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +23 -8
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -7
- data/lib/rubocop/cop/style/double_negation.rb +27 -6
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +26 -15
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +46 -11
- data/lib/rubocop/cop/style/float_division.rb +10 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +14 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +4 -0
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +11 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -0
- data/lib/rubocop/cop/style/hash_except.rb +4 -3
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -6
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +32 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +18 -4
- data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -2
- data/lib/rubocop/cop/style/lambda_call.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +6 -6
- data/lib/rubocop/cop/style/method_def_parentheses.rb +10 -1
- data/lib/rubocop/cop/style/missing_else.rb +7 -0
- data/lib/rubocop/cop/style/module_function.rb +8 -9
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +79 -14
- data/lib/rubocop/cop/style/negated_if.rb +1 -1
- data/lib/rubocop/cop/style/negated_unless.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +2 -2
- data/lib/rubocop/cop/style/not.rb +2 -2
- data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +50 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -8
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -0
- data/lib/rubocop/cop/style/optional_arguments.rb +4 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +14 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -4
- data/lib/rubocop/cop/style/quoted_symbols.rb +10 -6
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +19 -9
- data/lib/rubocop/cop/style/redundant_begin.rb +25 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +12 -3
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self.rb +10 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +83 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +53 -20
- data/lib/rubocop/cop/style/regexp_literal.rb +3 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +139 -0
- data/lib/rubocop/cop/style/semicolon.rb +32 -24
- data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +3 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +25 -15
- data/lib/rubocop/cop/style/slicing_with_range.rb +13 -0
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +25 -0
- data/lib/rubocop/cop/style/static_class.rb +5 -5
- data/lib/rubocop/cop/style/string_chars.rb +4 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +5 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +4 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -2
- data/lib/rubocop/cop/style/symbol_array.rb +3 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +26 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +19 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +23 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +24 -7
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -0
- data/lib/rubocop/cop/util.rb +22 -6
- data/lib/rubocop/cops_documentation_generator.rb +17 -5
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -1
- data/lib/rubocop/magic_comment.rb +44 -15
- data/lib/rubocop/options.rb +127 -113
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/result_cache.rb +3 -3
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/parallel_formatter.rb +90 -0
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +2 -3
- data/lib/rubocop/target_finder.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +14 -2
- metadata +21 -5
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Bundler
|
6
|
+
# This cop verifies that a project contains Gemfile or gems.rb file and correct
|
7
|
+
# associated lock file based on the configuration.
|
8
|
+
#
|
9
|
+
# @example EnforcedStyle: Gemfile (default)
|
10
|
+
# # bad
|
11
|
+
# Project contains gems.rb and gems.locked files
|
12
|
+
#
|
13
|
+
# # bad
|
14
|
+
# Project contains Gemfile and gems.locked file
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# Project contains Gemfile and Gemfile.lock
|
18
|
+
#
|
19
|
+
# @example EnforcedStyle: gems.rb
|
20
|
+
# # bad
|
21
|
+
# Project contains Gemfile and Gemfile.lock files
|
22
|
+
#
|
23
|
+
# # bad
|
24
|
+
# Project contains gems.rb and Gemfile.lock file
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# Project contains gems.rb and gems.locked files
|
28
|
+
class GemFilename < Base
|
29
|
+
include ConfigurableEnforcedStyle
|
30
|
+
include RangeHelp
|
31
|
+
|
32
|
+
MSG_GEMFILE_REQUIRED = '`gems.rb` file was found but `Gemfile` is required '\
|
33
|
+
'(file path: %<file_path>s).'
|
34
|
+
MSG_GEMS_RB_REQUIRED = '`Gemfile` was found but `gems.rb` file is required '\
|
35
|
+
'(file path: %<file_path>s).'
|
36
|
+
MSG_GEMFILE_MISMATCHED = 'Expected a `Gemfile.lock` with `Gemfile` but found '\
|
37
|
+
'`gems.locked` file (file path: %<file_path>s).'
|
38
|
+
MSG_GEMS_RB_MISMATCHED = 'Expected a `gems.locked` file with `gems.rb` but found '\
|
39
|
+
'`Gemfile.lock` (file path: %<file_path>s).'
|
40
|
+
GEMFILE_FILES = %w[Gemfile Gemfile.lock].freeze
|
41
|
+
GEMS_RB_FILES = %w[gems.rb gems.locked].freeze
|
42
|
+
|
43
|
+
def on_new_investigation
|
44
|
+
file_path = processed_source.file_path
|
45
|
+
basename = File.basename(file_path)
|
46
|
+
return if expected_gemfile?(basename)
|
47
|
+
|
48
|
+
register_offense(file_path, basename)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def register_offense(file_path, basename)
|
54
|
+
register_gemfile_offense(file_path, basename) if gemfile_offense?(basename)
|
55
|
+
register_gems_rb_offense(file_path, basename) if gems_rb_offense?(basename)
|
56
|
+
end
|
57
|
+
|
58
|
+
def register_gemfile_offense(file_path, basename)
|
59
|
+
message = case basename
|
60
|
+
when 'gems.rb'
|
61
|
+
MSG_GEMFILE_REQUIRED
|
62
|
+
when 'gems.locked'
|
63
|
+
MSG_GEMFILE_MISMATCHED
|
64
|
+
end
|
65
|
+
|
66
|
+
add_global_offense(format(message, file_path: file_path))
|
67
|
+
end
|
68
|
+
|
69
|
+
def register_gems_rb_offense(file_path, basename)
|
70
|
+
message = case basename
|
71
|
+
when 'Gemfile'
|
72
|
+
MSG_GEMS_RB_REQUIRED
|
73
|
+
when 'Gemfile.lock'
|
74
|
+
MSG_GEMS_RB_MISMATCHED
|
75
|
+
end
|
76
|
+
|
77
|
+
add_global_offense(format(message, file_path: file_path))
|
78
|
+
end
|
79
|
+
|
80
|
+
def gemfile_offense?(basename)
|
81
|
+
gemfile_required? && GEMS_RB_FILES.include?(basename)
|
82
|
+
end
|
83
|
+
|
84
|
+
def gems_rb_offense?(basename)
|
85
|
+
gems_rb_required? && GEMFILE_FILES.include?(basename)
|
86
|
+
end
|
87
|
+
|
88
|
+
def expected_gemfile?(basename)
|
89
|
+
(gemfile_required? && GEMFILE_FILES.include?(basename)) ||
|
90
|
+
(gems_rb_required? && GEMS_RB_FILES.include?(basename))
|
91
|
+
end
|
92
|
+
|
93
|
+
def gemfile_required?
|
94
|
+
style == :Gemfile
|
95
|
+
end
|
96
|
+
|
97
|
+
def gems_rb_required?
|
98
|
+
style == :'gems.rb'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -3,18 +3,21 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Bundler
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
|
6
|
+
# Passing symbol arguments to `source` (e.g. `source :rubygems`) is
|
7
|
+
# deprecated because they default to using HTTP requests. Instead, specify
|
8
|
+
# `'https://rubygems.org'` if possible, or `'http://rubygems.org'` if not.
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# most use cases HTTPS will be fine.
|
10
|
+
# When autocorrecting, this cop will replace symbol arguments with
|
11
|
+
# `'https://rubygems.org'`.
|
13
12
|
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
13
|
+
# This cop will not replace existing sources that use `http://`. This may
|
14
|
+
# be necessary where HTTPS is not available. For example, where using an
|
15
|
+
# internal gem server via an intranet, or where HTTPS is prohibited.
|
16
|
+
# However, you should strongly prefer `https://` where possible, as it is
|
17
|
+
# more secure.
|
18
|
+
#
|
19
|
+
# If you don't allow `http://`, please set `false` to `AllowHttpProtocol`.
|
20
|
+
# This option is `true` by default for safe autocorrection.
|
18
21
|
#
|
19
22
|
# @example
|
20
23
|
# # bad
|
@@ -24,7 +27,17 @@ module RuboCop
|
|
24
27
|
#
|
25
28
|
# # good
|
26
29
|
# source 'https://rubygems.org' # strongly recommended
|
30
|
+
#
|
31
|
+
# @example AllowHttpProtocol: true (default)
|
32
|
+
#
|
33
|
+
# # good
|
34
|
+
# source 'http://rubygems.org' # use only if HTTPS is unavailable
|
35
|
+
#
|
36
|
+
# @example AllowHttpProtocol: false
|
37
|
+
#
|
38
|
+
# # bad
|
27
39
|
# source 'http://rubygems.org'
|
40
|
+
#
|
28
41
|
class InsecureProtocolSource < Base
|
29
42
|
include RangeHelp
|
30
43
|
extend AutoCorrector
|
@@ -33,29 +46,40 @@ module RuboCop
|
|
33
46
|
'are insecure. ' \
|
34
47
|
"Please change your source to 'https://rubygems.org' " \
|
35
48
|
"if possible, or 'http://rubygems.org' if not."
|
49
|
+
MSG_HTTP_PROTOCOL = 'Use `https://rubygems.org` instead of `http://rubygems.org`.'
|
36
50
|
|
37
51
|
RESTRICT_ON_SEND = %i[source].freeze
|
38
52
|
|
39
53
|
# @!method insecure_protocol_source?(node)
|
40
54
|
def_node_matcher :insecure_protocol_source?, <<~PATTERN
|
41
55
|
(send nil? :source
|
42
|
-
$(sym
|
56
|
+
${(sym :gemcutter) (sym :rubygems) (sym :rubyforge) (:str "http://rubygems.org")})
|
43
57
|
PATTERN
|
44
58
|
|
45
59
|
def on_send(node)
|
46
|
-
insecure_protocol_source?(node) do |source_node
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
60
|
+
insecure_protocol_source?(node) do |source_node|
|
61
|
+
source = source_node.value
|
62
|
+
use_http_protocol = source == 'http://rubygems.org'
|
63
|
+
|
64
|
+
return if allow_http_protocol? && use_http_protocol
|
65
|
+
|
66
|
+
message = if use_http_protocol
|
67
|
+
MSG_HTTP_PROTOCOL
|
68
|
+
else
|
69
|
+
format(MSG, source: source)
|
70
|
+
end
|
71
|
+
|
72
|
+
add_offense(source_node, message: message) do |corrector|
|
73
|
+
corrector.replace(source_node, "'https://rubygems.org'")
|
56
74
|
end
|
57
75
|
end
|
58
76
|
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def allow_http_protocol?
|
81
|
+
cop_config.fetch('AllowHttpProtocol', true)
|
82
|
+
end
|
59
83
|
end
|
60
84
|
end
|
61
85
|
end
|
@@ -24,15 +24,15 @@ module RuboCop
|
|
24
24
|
# gem 'rubocop'
|
25
25
|
# # For tests
|
26
26
|
# gem 'rspec'
|
27
|
-
class OrderedGems <
|
28
|
-
|
27
|
+
class OrderedGems < Base
|
28
|
+
extend AutoCorrector
|
29
29
|
include OrderedGemNode
|
30
30
|
|
31
31
|
MSG = 'Gems should be sorted in an alphabetical order within their '\
|
32
32
|
'section of the Gemfile. '\
|
33
33
|
'Gem `%<previous>s` should appear before `%<current>s`.'
|
34
34
|
|
35
|
-
def
|
35
|
+
def on_new_investigation
|
36
36
|
return if processed_source.blank?
|
37
37
|
|
38
38
|
gem_declarations(processed_source.ast)
|
@@ -44,15 +44,6 @@ module RuboCop
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def autocorrect(node)
|
48
|
-
OrderedGemCorrector.correct(
|
49
|
-
processed_source,
|
50
|
-
node,
|
51
|
-
previous_declaration(node),
|
52
|
-
treat_comments_as_separators
|
53
|
-
)
|
54
|
-
end
|
55
|
-
|
56
47
|
private
|
57
48
|
|
58
49
|
def previous_declaration(node)
|
@@ -87,8 +87,8 @@ module RuboCop
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def needs_separating_space?
|
90
|
-
block_begin.begin_pos == arguments_end_pos &&
|
91
|
-
selector_end.end_pos == arguments_begin_pos ||
|
90
|
+
(block_begin.begin_pos == arguments_end_pos &&
|
91
|
+
selector_end.end_pos == arguments_begin_pos) ||
|
92
92
|
block_begin.begin_pos == selector_end.end_pos
|
93
93
|
end
|
94
94
|
|
@@ -4,9 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# This auto-corrects gem dependency order
|
6
6
|
class OrderedGemCorrector
|
7
|
-
extend OrderedGemNode
|
8
|
-
|
9
7
|
class << self
|
8
|
+
include OrderedGemNode
|
9
|
+
include RangeHelp
|
10
|
+
|
10
11
|
attr_reader :processed_source, :comments_as_separators
|
11
12
|
|
12
13
|
def correct(processed_source, node,
|
@@ -17,24 +18,24 @@ module RuboCop
|
|
17
18
|
current_range = declaration_with_comment(node)
|
18
19
|
previous_range = declaration_with_comment(previous_declaration)
|
19
20
|
|
20
|
-
->(corrector)
|
21
|
+
->(corrector) { swap_range(corrector, current_range, previous_range) }
|
21
22
|
end
|
22
23
|
|
23
24
|
private
|
24
25
|
|
25
26
|
def declaration_with_comment(node)
|
26
27
|
buffer = processed_source.buffer
|
27
|
-
begin_pos = get_source_range(node, comments_as_separators).begin_pos
|
28
|
+
begin_pos = range_by_whole_lines(get_source_range(node, comments_as_separators)).begin_pos
|
28
29
|
end_line = buffer.line_for_position(node.loc.expression.end_pos)
|
29
|
-
end_pos = buffer.line_range(end_line)
|
30
|
-
|
30
|
+
end_pos = range_by_whole_lines(buffer.line_range(end_line),
|
31
|
+
include_final_newline: true).end_pos
|
32
|
+
|
33
|
+
range_between(begin_pos, end_pos)
|
31
34
|
end
|
32
35
|
|
33
36
|
def swap_range(corrector, range1, range2)
|
34
|
-
|
35
|
-
|
36
|
-
corrector.replace(range1, src2)
|
37
|
-
corrector.replace(range2, src1)
|
37
|
+
corrector.insert_before(range2, range1.source)
|
38
|
+
corrector.remove(range1)
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# This class ensures a require statement is present for a standard library
|
6
|
+
# determined by the variable library_name
|
7
|
+
class RequireLibraryCorrector
|
8
|
+
extend RangeHelp
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def correct(corrector, node, library_name)
|
12
|
+
node = node.parent while node.parent?
|
13
|
+
node = node.children.first if node.begin_type?
|
14
|
+
corrector.insert_before(node, require_statement(library_name))
|
15
|
+
end
|
16
|
+
|
17
|
+
def require_statement(library_name)
|
18
|
+
"require '#{library_name}'\n"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -50,15 +50,15 @@ module RuboCop
|
|
50
50
|
# spec.add_dependency 'rubocop'
|
51
51
|
# # For tests
|
52
52
|
# spec.add_dependency 'rspec'
|
53
|
-
class OrderedDependencies <
|
54
|
-
|
53
|
+
class OrderedDependencies < Base
|
54
|
+
extend AutoCorrector
|
55
55
|
include OrderedGemNode
|
56
56
|
|
57
57
|
MSG = 'Dependencies should be sorted in an alphabetical order within ' \
|
58
58
|
'their section of the gemspec. '\
|
59
59
|
'Dependency `%<previous>s` should appear before `%<current>s`.'
|
60
60
|
|
61
|
-
def
|
61
|
+
def on_new_investigation
|
62
62
|
return if processed_source.blank?
|
63
63
|
|
64
64
|
dependency_declarations(processed_source.ast)
|
@@ -71,15 +71,6 @@ module RuboCop
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
def autocorrect(node)
|
75
|
-
OrderedGemCorrector.correct(
|
76
|
-
processed_source,
|
77
|
-
node,
|
78
|
-
previous_declaration(node),
|
79
|
-
treat_comments_as_separators
|
80
|
-
)
|
81
|
-
end
|
82
|
-
|
83
74
|
private
|
84
75
|
|
85
76
|
def previous_declaration(node)
|
@@ -3,10 +3,11 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Gemspec
|
6
|
-
# Checks that `required_ruby_version`
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# Checks that `required_ruby_version` in a gemspec file is set to a valid
|
7
|
+
# value (non-blank) and matches `TargetRubyVersion` as set in RuboCop's
|
8
|
+
# configuration for the gem.
|
9
|
+
#
|
10
|
+
# This ensures that RuboCop is using the same Ruby version as the gem.
|
10
11
|
#
|
11
12
|
# @example
|
12
13
|
# # When `TargetRubyVersion` of .rubocop.yml is `2.5`.
|
@@ -26,6 +27,11 @@ module RuboCop
|
|
26
27
|
# spec.required_ruby_version = '>= 2.6.0'
|
27
28
|
# end
|
28
29
|
#
|
30
|
+
# # bad
|
31
|
+
# Gem::Specification.new do |spec|
|
32
|
+
# spec.required_ruby_version = ''
|
33
|
+
# end
|
34
|
+
#
|
29
35
|
# # good
|
30
36
|
# Gem::Specification.new do |spec|
|
31
37
|
# spec.required_ruby_version = '>= 2.5.0'
|
@@ -42,22 +48,22 @@ module RuboCop
|
|
42
48
|
# end
|
43
49
|
#
|
44
50
|
# # accepted but not recommended, since
|
45
|
-
# # Ruby does not really follow semantic
|
51
|
+
# # Ruby does not really follow semantic versioning
|
46
52
|
# Gem::Specification.new do |spec|
|
47
53
|
# spec.required_ruby_version = '~> 2.5'
|
48
54
|
# end
|
49
55
|
class RequiredRubyVersion < Base
|
50
56
|
include RangeHelp
|
51
57
|
|
52
|
-
|
53
|
-
|
58
|
+
RESTRICT_ON_SEND = %i[required_ruby_version=].freeze
|
59
|
+
NOT_EQUAL_MSG = '`required_ruby_version` and `TargetRubyVersion` ' \
|
54
60
|
'(%<target_ruby_version>s, which may be specified in ' \
|
55
61
|
'.rubocop.yml) should be equal.'
|
56
62
|
MISSING_MSG = '`required_ruby_version` should be specified.'
|
57
63
|
|
58
|
-
# @!method required_ruby_version(node)
|
59
|
-
def_node_search :required_ruby_version
|
60
|
-
(send _ :required_ruby_version=
|
64
|
+
# @!method required_ruby_version?(node)
|
65
|
+
def_node_search :required_ruby_version?, <<~PATTERN
|
66
|
+
(send _ :required_ruby_version= _)
|
61
67
|
PATTERN
|
62
68
|
|
63
69
|
# @!method defined_ruby_version(node)
|
@@ -66,27 +72,28 @@ module RuboCop
|
|
66
72
|
(send (const (const nil? :Gem) :Requirement) :new $(str _))}
|
67
73
|
PATTERN
|
68
74
|
|
69
|
-
# rubocop:disable Metrics/AbcSize
|
70
75
|
def on_new_investigation
|
71
|
-
|
76
|
+
add_global_offense(MISSING_MSG) unless required_ruby_version?(processed_source.ast)
|
77
|
+
end
|
72
78
|
|
73
|
-
|
74
|
-
|
75
|
-
|
79
|
+
def on_send(node)
|
80
|
+
version_def = node.first_argument
|
81
|
+
return if dynamic_version?(version_def)
|
76
82
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
else
|
82
|
-
range = source_range(processed_source.buffer, 1, 0)
|
83
|
-
add_offense(range, message: MISSING_MSG)
|
84
|
-
end
|
83
|
+
ruby_version = extract_ruby_version(defined_ruby_version(version_def))
|
84
|
+
return if ruby_version == target_ruby_version.to_s
|
85
|
+
|
86
|
+
add_offense(version_def, message: not_equal_message(ruby_version, target_ruby_version))
|
85
87
|
end
|
86
|
-
# rubocop:enable Metrics/AbcSize
|
87
88
|
|
88
89
|
private
|
89
90
|
|
91
|
+
def dynamic_version?(node)
|
92
|
+
(node.send_type? && !node.receiver) ||
|
93
|
+
node.variable? ||
|
94
|
+
node.each_descendant(:send, *RuboCop::AST::Node::VARIABLES).any?
|
95
|
+
end
|
96
|
+
|
90
97
|
def extract_ruby_version(required_ruby_version)
|
91
98
|
return unless required_ruby_version
|
92
99
|
|
@@ -24,6 +24,11 @@ module RuboCop
|
|
24
24
|
# `SupportedStyle` and unique configuration, there needs to be examples.
|
25
25
|
# Examples must have valid Ruby syntax. Do not use upticks.
|
26
26
|
#
|
27
|
+
# @safety
|
28
|
+
# Delete this section if the cop is not unsafe (`Safe: false` or
|
29
|
+
# `SafeAutoCorrect: false`), or use it to explain how the cop is
|
30
|
+
# unsafe.
|
31
|
+
#
|
27
32
|
# @example EnforcedStyle: bar (default)
|
28
33
|
# # Description of the `bar` style.
|
29
34
|
#
|
@@ -106,9 +111,8 @@ module RuboCop
|
|
106
111
|
'[modify] A configuration for the cop is added into ' \
|
107
112
|
'%<configuration_file_path>s.'
|
108
113
|
|
109
|
-
def initialize(name,
|
114
|
+
def initialize(name, output: $stdout)
|
110
115
|
@badge = Badge.parse(name)
|
111
|
-
@github_user = github_user
|
112
116
|
@output = output
|
113
117
|
return if badge.qualified?
|
114
118
|
|
@@ -142,17 +146,19 @@ module RuboCop
|
|
142
146
|
|
143
147
|
def todo
|
144
148
|
<<~TODO
|
145
|
-
Do
|
146
|
-
1.
|
147
|
-
|
148
|
-
|
149
|
-
|
149
|
+
Do 4 steps:
|
150
|
+
1. Modify the description of #{badge} in config/default.yml
|
151
|
+
2. Implement your new cop in the generated file!
|
152
|
+
3. Commit your new cop with a message such as
|
153
|
+
e.g. "Add new `#{badge}` cop."
|
154
|
+
4. Run `bundle exec rake changelog:new` to generate a changelog entry
|
155
|
+
for your new cop.
|
150
156
|
TODO
|
151
157
|
end
|
152
158
|
|
153
159
|
private
|
154
160
|
|
155
|
-
attr_reader :badge, :
|
161
|
+
attr_reader :badge, :output
|
156
162
|
|
157
163
|
def write_unless_file_exists(path, contents)
|
158
164
|
if File.exist?(path)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# `RuboCop::Cop::Cop` is deprecated and will be removed in Rubocop 2.0.
|
7
|
+
# Your custom cop class should inherit from `RuboCop::Cop::Base` instead of
|
8
|
+
# `RuboCop::Cop::Cop`.
|
9
|
+
#
|
10
|
+
# See "v1 Upgrade Notes" for more details:
|
11
|
+
# https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# # bad
|
15
|
+
# class Foo < Cop
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# class Foo < Base
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
class InheritDeprecatedCopClass < Base
|
23
|
+
MSG = 'Use `Base` instead of `Cop`.'
|
24
|
+
|
25
|
+
def on_class(node)
|
26
|
+
return unless (parent_class = node.parent_class)
|
27
|
+
return unless parent_class.children.last == :Cop
|
28
|
+
|
29
|
+
add_offense(parent_class)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# This cop enforces the use of `same_line?` instead of location line comparison for equality.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# node.loc.line == node.parent.loc.line
|
11
|
+
#
|
12
|
+
# # bad
|
13
|
+
# node.loc.first_line == node.parent.loc.first_line
|
14
|
+
#
|
15
|
+
# # good
|
16
|
+
# same_line?(node, node.parent)
|
17
|
+
#
|
18
|
+
class LocationLineEqualityComparison < Base
|
19
|
+
extend AutoCorrector
|
20
|
+
|
21
|
+
MSG = 'Use `%<preferred>s`.'
|
22
|
+
|
23
|
+
# @!method line_send(node)
|
24
|
+
def_node_matcher :line_send, <<~PATTERN
|
25
|
+
{
|
26
|
+
(send (send _ {:loc :source_range}) {:line :first_line})
|
27
|
+
(send _ :first_line)
|
28
|
+
}
|
29
|
+
PATTERN
|
30
|
+
|
31
|
+
# @!method location_line_equality_comparison?(node)
|
32
|
+
def_node_matcher :location_line_equality_comparison?, <<~PATTERN
|
33
|
+
(send #line_send :== #line_send)
|
34
|
+
PATTERN
|
35
|
+
|
36
|
+
def on_send(node)
|
37
|
+
return unless location_line_equality_comparison?(node)
|
38
|
+
|
39
|
+
lhs, _op, rhs = *node
|
40
|
+
|
41
|
+
lhs_receiver = extract_receiver(lhs)
|
42
|
+
rhs_receiver = extract_receiver(rhs)
|
43
|
+
preferred = "same_line?(#{lhs_receiver}, #{rhs_receiver})"
|
44
|
+
|
45
|
+
add_offense(node, message: format(MSG, preferred: preferred)) do |corrector|
|
46
|
+
corrector.replace(node, preferred)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def extract_receiver(node)
|
53
|
+
receiver = node.receiver
|
54
|
+
receiver = receiver.receiver if receiver.method?(:loc) || receiver.method?(:source_range)
|
55
|
+
receiver.source
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
extend AutoCorrector
|
24
24
|
include RangeHelp
|
25
25
|
|
26
|
-
MSG = '
|
26
|
+
MSG = 'Precede `%<method>s` with a `@!method` YARD directive.'
|
27
27
|
MSG_WRONG_NAME = '`@!method` YARD directive has invalid method name, ' \
|
28
28
|
'use `%<expected>s` instead of `%<actual>s`.'
|
29
29
|
MSG_TOO_MANY = 'Multiple `@!method` YARD directives found for this matcher.'
|