rubocop 0.59.2 → 0.60.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +3 -2
- data/config/default.yml +2960 -552
- data/lib/rubocop.rb +1 -0
- data/lib/rubocop/ast/builder.rb +29 -29
- data/lib/rubocop/ast/node.rb +29 -25
- data/lib/rubocop/ast/node/args_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +26 -0
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +5 -1
- data/lib/rubocop/ast/node/pair_node.rb +8 -1
- data/lib/rubocop/ast/node/str_node.rb +1 -1
- data/lib/rubocop/cached_data.rb +2 -2
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +8 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +7 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -1
- data/lib/rubocop/cop/generator.rb +10 -3
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/layout/align_hash.rb +9 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +2 -4
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +7 -7
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -2
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +25 -25
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +1 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indent_hash.rb +1 -1
- data/lib/rubocop/cop/layout/indent_heredoc.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +84 -43
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -2
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +5 -5
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +10 -20
- data/lib/rubocop/cop/lint/ensure_return.rb +3 -0
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -3
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +10 -7
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +3 -4
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -2
- data/lib/rubocop/cop/lint/syntax.rb +3 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -3
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -17
- data/lib/rubocop/cop/metrics/line_length.rb +14 -10
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +45 -0
- data/lib/rubocop/cop/mixin/check_assignment.rb +12 -6
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +0 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +4 -2
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +2 -2
- data/lib/rubocop/cop/mixin/hash_alignment.rb +32 -5
- data/lib/rubocop/cop/mixin/heredoc.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -4
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -0
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +2 -0
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +1 -1
- data/lib/rubocop/cop/performance/regexp_match.rb +1 -1
- data/lib/rubocop/cop/performance/sample.rb +3 -2
- data/lib/rubocop/cop/performance/start_with.rb +1 -1
- data/lib/rubocop/cop/performance/string_replacement.rb +1 -1
- data/lib/rubocop/cop/rails/date.rb +8 -8
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -1
- data/lib/rubocop/cop/rails/exit.rb +8 -9
- data/lib/rubocop/cop/rails/output_safety.rb +3 -3
- data/lib/rubocop/cop/rails/read_write_attribute.rb +5 -4
- data/lib/rubocop/cop/rails/refute_methods.rb +13 -13
- data/lib/rubocop/cop/rails/reversible_migration.rb +2 -1
- data/lib/rubocop/cop/rails/skips_model_validations.rb +17 -0
- data/lib/rubocop/cop/registry.rb +11 -2
- data/lib/rubocop/cop/style/and_or.rb +3 -3
- data/lib/rubocop/cop/style/collection_methods.rb +26 -0
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +3 -3
- data/lib/rubocop/cop/style/global_vars.rb +1 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -13
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +4 -7
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +1 -1
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +15 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/not.rb +2 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +10 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +6 -2
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -3
- data/lib/rubocop/cop/style/unneeded_condition.rb +2 -2
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/unpack_first.rb +1 -1
- data/lib/rubocop/cop/team.rb +3 -2
- data/lib/rubocop/cop/util.rb +2 -22
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +3 -4
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
- data/lib/rubocop/formatter/base_formatter.rb +3 -3
- data/lib/rubocop/formatter/disabled_config_formatter.rb +16 -1
- data/lib/rubocop/formatter/formatter_set.rb +14 -14
- data/lib/rubocop/formatter/html_formatter.rb +4 -4
- data/lib/rubocop/formatter/json_formatter.rb +13 -13
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -4
- data/lib/rubocop/magic_comment.rb +4 -4
- data/lib/rubocop/node_pattern.rb +17 -17
- data/lib/rubocop/options.rb +93 -82
- data/lib/rubocop/result_cache.rb +9 -1
- data/lib/rubocop/rspec/expect_offense.rb +2 -2
- data/lib/rubocop/rspec/shared_contexts.rb +11 -11
- data/lib/rubocop/rspec/shared_examples.rb +4 -4
- data/lib/rubocop/string_interpreter.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +6 -13
- data/config/disabled.yml +0 -161
- data/config/enabled.yml +0 -2092
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
def style_detected(detected)
|
24
24
|
return if no_acceptable_style?
|
25
25
|
|
26
|
-
# `detected` can be a single style
|
26
|
+
# `detected` can be a single style or an Array of possible styles
|
27
27
|
# (if there is more than one which matches the observed code)
|
28
28
|
detected_as_strings = Array(detected).map(&:to_s)
|
29
29
|
|
@@ -9,8 +9,10 @@ module RuboCop
|
|
9
9
|
|
10
10
|
def max=(value)
|
11
11
|
cfg = config_to_allow_offenses
|
12
|
-
|
13
|
-
cfg[max_parameter_name]
|
12
|
+
cfg[:exclude_limit] ||= {}
|
13
|
+
current_max = cfg[:exclude_limit][max_parameter_name]
|
14
|
+
value = [current_max, value].max if current_max
|
15
|
+
cfg[:exclude_limit][max_parameter_name] = value
|
14
16
|
end
|
15
17
|
|
16
18
|
def max_parameter_name
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
8
8
|
include ConfigurableFormatting
|
9
9
|
|
10
10
|
FORMATS = {
|
11
|
-
snake_case:
|
12
|
-
normalcase:
|
11
|
+
snake_case: /(?:[a-z_]|_\d+)$/,
|
12
|
+
normalcase: /(?:_\D*|[A-Za-z]\d*)$/,
|
13
13
|
non_integer: /[A-Za-z_]$/
|
14
14
|
}.freeze
|
15
15
|
end
|
@@ -10,17 +10,46 @@ module RuboCop
|
|
10
10
|
true
|
11
11
|
end
|
12
12
|
|
13
|
-
def deltas_for_first_pair(
|
14
|
-
{
|
13
|
+
def deltas_for_first_pair(first_pair, _node)
|
14
|
+
{
|
15
|
+
separator: separator_delta(first_pair),
|
16
|
+
value: value_delta(first_pair)
|
17
|
+
}
|
15
18
|
end
|
16
19
|
|
17
20
|
def deltas(first_pair, current_pair)
|
18
21
|
if Util.begins_its_line?(current_pair.source_range)
|
19
|
-
|
22
|
+
key_delta = first_pair.key_delta(current_pair)
|
23
|
+
separator_delta = separator_delta(current_pair)
|
24
|
+
value_delta = value_delta(current_pair)
|
25
|
+
|
26
|
+
{ key: key_delta, separator: separator_delta, value: value_delta }
|
20
27
|
else
|
21
28
|
{}
|
22
29
|
end
|
23
30
|
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def separator_delta(pair)
|
35
|
+
if pair.hash_rocket?
|
36
|
+
correct_separator_column = pair.key.loc.expression.end.column + 1
|
37
|
+
actual_separator_column = pair.loc.operator.column
|
38
|
+
|
39
|
+
correct_separator_column - actual_separator_column
|
40
|
+
else
|
41
|
+
0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def value_delta(pair)
|
46
|
+
return 0 if pair.kwsplat_type? || pair.value_on_new_line?
|
47
|
+
|
48
|
+
correct_value_column = pair.loc.operator.end.column + 1
|
49
|
+
actual_value_column = pair.value.loc.column
|
50
|
+
|
51
|
+
correct_value_column - actual_value_column
|
52
|
+
end
|
24
53
|
end
|
25
54
|
|
26
55
|
# Common functionality for checking alignment of hash values.
|
@@ -54,8 +83,6 @@ module RuboCop
|
|
54
83
|
class TableAlignment
|
55
84
|
include ValueAlignment
|
56
85
|
|
57
|
-
# The table style is the only one where the first key-value pair can
|
58
|
-
# be considered to have bad alignment.
|
59
86
|
def deltas_for_first_pair(first_pair, node)
|
60
87
|
self.max_key_width = node.keys.map { |key| key.source.length }.max
|
61
88
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for working with heredoc strings.
|
6
6
|
module Heredoc
|
7
|
-
OPENING_DELIMITER = /(<<[~-]?)['"`]?([^'"`]+)['"`]
|
7
|
+
OPENING_DELIMITER = /(<<[~-]?)['"`]?([^'"`]+)['"`]?/.freeze
|
8
8
|
|
9
9
|
def on_str(node)
|
10
10
|
return unless node.heredoc?
|
@@ -5,10 +5,9 @@ module RuboCop
|
|
5
5
|
# Common functionality for checking multiline method calls and binary
|
6
6
|
# operations.
|
7
7
|
module MultilineExpressionIndentation # rubocop:disable Metrics/ModuleLength
|
8
|
-
KEYWORD_ANCESTOR_TYPES = [
|
8
|
+
KEYWORD_ANCESTOR_TYPES = %i[for if while until return].freeze
|
9
9
|
UNALIGNED_RHS_TYPES = %i[if while until for return
|
10
10
|
array kwbegin].freeze
|
11
|
-
ASSIGNMENT_RHS_TYPES = [:send, *Util::ASGN_NODES].freeze
|
12
11
|
DEFAULT_MESSAGE_TAIL = 'an expression'.freeze
|
13
12
|
ASSIGNMENT_MESSAGE_TAIL = 'an expression in an assignment'.freeze
|
14
13
|
KEYWORD_MESSAGE_TAIL = 'a %<kind>s in %<article>s `%<keyword>s` ' \
|
@@ -121,7 +120,7 @@ module RuboCop
|
|
121
120
|
def keyword_message_tail(node)
|
122
121
|
keyword = node.loc.keyword.source
|
123
122
|
kind = keyword == 'for' ? 'collection' : 'condition'
|
124
|
-
article = keyword
|
123
|
+
article = keyword.start_with?('i', 'u') ? 'an' : 'a'
|
125
124
|
|
126
125
|
format(KEYWORD_MESSAGE_TAIL, kind: kind,
|
127
126
|
article: article,
|
@@ -191,7 +190,7 @@ module RuboCop
|
|
191
190
|
def valid_rhs?(candidate, ancestor)
|
192
191
|
if ancestor.send_type?
|
193
192
|
valid_method_rhs_candidate?(candidate, ancestor)
|
194
|
-
elsif
|
193
|
+
elsif ancestor.assignment?
|
195
194
|
valid_rhs_candidate?(candidate, assignment_rhs(ancestor))
|
196
195
|
else
|
197
196
|
false
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
# Common functionality for checking the closing brace of a literal is
|
6
|
-
# either on the same line as the last contained elements
|
6
|
+
# either on the same line as the last contained elements or a new line.
|
7
7
|
module MultilineLiteralBraceLayout
|
8
8
|
include ConfigurableEnforcedStyle
|
9
9
|
|
@@ -32,6 +32,8 @@ module RuboCop
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def modifier_fits_on_single_line?(node)
|
35
|
+
return true unless max_line_length
|
36
|
+
|
35
37
|
modifier_length = length_in_modifier_form(node, node.condition,
|
36
38
|
node.body.source_length)
|
37
39
|
|
@@ -47,6 +49,8 @@ module RuboCop
|
|
47
49
|
end
|
48
50
|
|
49
51
|
def max_line_length
|
52
|
+
return unless config.for_cop('Metrics/LineLength')['Enabled']
|
53
|
+
|
50
54
|
config.for_cop('Metrics/LineLength')['Max']
|
51
55
|
end
|
52
56
|
|
@@ -86,7 +86,7 @@ module RuboCop
|
|
86
86
|
end
|
87
87
|
|
88
88
|
# Returns true if the round/square/curly brackets of the given node are
|
89
|
-
# on different lines,
|
89
|
+
# on different lines, each item within is on its own line, and the
|
90
90
|
# closing bracket is on its own line.
|
91
91
|
def multiline?(node)
|
92
92
|
# No need to process anything if the whole node is not multiline
|
@@ -21,7 +21,7 @@ module RuboCop
|
|
21
21
|
MSG = 'Use SCREAMING_SNAKE_CASE for constants.'.freeze
|
22
22
|
# Use POSIX character classes, so we allow accented characters rather
|
23
23
|
# than just standard ASCII characters
|
24
|
-
SNAKE_CASE = /^[[:digit:][:upper:]_]
|
24
|
+
SNAKE_CASE = /^[[:digit:][:upper:]_]+$/.freeze
|
25
25
|
|
26
26
|
def_node_matcher :class_or_struct_return_method?, <<-PATTERN
|
27
27
|
(send
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
'called `%<namespace>s`.'.freeze
|
34
34
|
MSG_REGEX = '`%<basename>s` should match `%<regex>s`.'.freeze
|
35
35
|
|
36
|
-
SNAKE_CASE = /^[\da-z_.?!]
|
36
|
+
SNAKE_CASE = /^[\da-z_.?!]+$/.freeze
|
37
37
|
|
38
38
|
def investigate(processed_source)
|
39
39
|
file_path = processed_source.file_path
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Naming
|
6
6
|
# This cop makes sure that all numbered variables use the
|
7
|
-
# configured style, snake_case, normalcase or non_integer,
|
7
|
+
# configured style, snake_case, normalcase, or non_integer,
|
8
8
|
# for their numbering.
|
9
9
|
#
|
10
10
|
# @example EnforcedStyle: snake_case
|
data/lib/rubocop/cop/offense.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Performance
|
6
|
-
# In Ruby 2.4, `String#match?`, `Regexp#match
|
6
|
+
# In Ruby 2.4, `String#match?`, `Regexp#match?`, and `Symbol#match?`
|
7
7
|
# have been added. The methods are faster than `match`.
|
8
8
|
# Because the methods avoid creating a `MatchData` object or saving
|
9
9
|
# backref.
|
@@ -3,8 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Performance
|
6
|
-
# This cop is used to identify usages of `shuffle.first`,
|
7
|
-
# and `shuffle[]` and change them to use
|
6
|
+
# This cop is used to identify usages of `shuffle.first`,
|
7
|
+
# `shuffle.last`, and `shuffle[]` and change them to use
|
8
|
+
# `sample` instead.
|
8
9
|
#
|
9
10
|
# @example
|
10
11
|
# # bad
|
@@ -26,7 +26,7 @@ module RuboCop
|
|
26
26
|
|
27
27
|
def literal_at_start?(regex_str)
|
28
28
|
# is this regexp 'literal' in the sense of only matching literal
|
29
|
-
# chars, rather than using metachars like
|
29
|
+
# chars, rather than using metachars like `.` and `*` and so on?
|
30
30
|
# also, is it anchored at the start of the string?
|
31
31
|
# (tricky: \s, \d, and so on are metacharacters, but other characters
|
32
32
|
# escaped with a slash are just literals. LITERAL_REGEX takes all
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
include RangeHelp
|
23
23
|
|
24
24
|
MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
|
25
|
-
DETERMINISTIC_REGEX = /\A(?:#{LITERAL_REGEX})+\Z
|
25
|
+
DETERMINISTIC_REGEX = /\A(?:#{LITERAL_REGEX})+\Z/.freeze
|
26
26
|
DELETE = 'delete'.freeze
|
27
27
|
TR = 'tr'.freeze
|
28
28
|
BANG = '!'.freeze
|
@@ -6,19 +6,19 @@ module RuboCop
|
|
6
6
|
# This cop checks for the correct use of Date methods,
|
7
7
|
# such as Date.today, Date.current etc.
|
8
8
|
#
|
9
|
-
# Using Date.today is dangerous, because it doesn't know anything about
|
10
|
-
# Rails time zone. You must use Time.zone.today instead.
|
9
|
+
# Using `Date.today` is dangerous, because it doesn't know anything about
|
10
|
+
# Rails time zone. You must use `Time.zone.today` instead.
|
11
11
|
#
|
12
|
-
# The cop also reports warnings when you are using
|
12
|
+
# The cop also reports warnings when you are using `to_time` method,
|
13
13
|
# because it doesn't know about Rails time zone either.
|
14
14
|
#
|
15
15
|
# Two styles are supported for this cop. When EnforcedStyle is 'strict'
|
16
|
-
# then the Date methods
|
17
|
-
# are prohibited and the usage of both
|
18
|
-
# and 'to_time_in_current_zone'
|
16
|
+
# then the Date methods `today`, `current`, `yesterday`, and `tomorrow`
|
17
|
+
# are prohibited and the usage of both `to_time`
|
18
|
+
# and 'to_time_in_current_zone' are reported as warning.
|
19
19
|
#
|
20
|
-
# When EnforcedStyle is 'flexible' then only
|
21
|
-
# and only
|
20
|
+
# When EnforcedStyle is 'flexible' then only `Date.today` is prohibited
|
21
|
+
# and only `to_time` is reported as warning.
|
22
22
|
#
|
23
23
|
# @example EnforcedStyle: strict
|
24
24
|
# # bad
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
27
27
|
# User.find_by!(email: email)
|
28
28
|
class DynamicFindBy < Cop
|
29
29
|
MSG = 'Use `%<static_name>s` instead of dynamic `%<method>s`.'.freeze
|
30
|
-
METHOD_PATTERN = /^find_by_(.+?)(!)
|
30
|
+
METHOD_PATTERN = /^find_by_(.+?)(!)?$/.freeze
|
31
31
|
|
32
32
|
def on_send(node)
|
33
33
|
method_name = node.method_name.to_s
|
@@ -3,15 +3,15 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Rails
|
6
|
-
# This cop enforces that
|
7
|
-
# Valid options are instead to raise an error, break, return or some
|
6
|
+
# This cop enforces that `exit` calls are not used within a rails app.
|
7
|
+
# Valid options are instead to raise an error, break, return, or some
|
8
8
|
# other form of stopping execution of current request.
|
9
9
|
#
|
10
|
-
# There are two obvious cases where
|
10
|
+
# There are two obvious cases where `exit` is particularly harmful:
|
11
11
|
#
|
12
|
-
# - Usage in library code for your application. Even though
|
13
|
-
# rescue from a SystemExit and continue on, unit testing that library
|
14
|
-
# code will result in specs exiting (potentially silently if exit(0)
|
12
|
+
# - Usage in library code for your application. Even though Rails will
|
13
|
+
# rescue from a `SystemExit` and continue on, unit testing that library
|
14
|
+
# code will result in specs exiting (potentially silently if `exit(0)`
|
15
15
|
# is used.)
|
16
16
|
# - Usage in application code outside of the web process could result in
|
17
17
|
# the program exiting, which could result in the code failing to run and
|
@@ -52,9 +52,8 @@ module RuboCop
|
|
52
52
|
arg_nodes.size <= 1
|
53
53
|
end
|
54
54
|
|
55
|
-
# Only register if exit is being called explicitly on
|
56
|
-
#
|
57
|
-
# `exit` calls.
|
55
|
+
# Only register if exit is being called explicitly on `Kernel`,
|
56
|
+
# `Process`, or if receiver node is nil for plain `exit` calls.
|
58
57
|
def right_receiver?(receiver_node)
|
59
58
|
return true unless receiver_node
|
60
59
|
|
@@ -3,10 +3,10 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Rails
|
6
|
-
# This cop checks for the use of output safety calls like html_safe
|
7
|
-
# raw
|
6
|
+
# This cop checks for the use of output safety calls like `html_safe`,
|
7
|
+
# `raw`, and `safe_concat`. These methods do not escape content. They
|
8
8
|
# simply return a SafeBuffer containing the content as is. Instead,
|
9
|
-
# use safe_join to join content and escape it and concat to
|
9
|
+
# use `safe_join` to join content and escape it and concat to
|
10
10
|
# concatenate content and escape it, ensuring its safety.
|
11
11
|
#
|
12
12
|
# @example
|
@@ -3,12 +3,13 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Rails
|
6
|
-
# This cop checks for the use of the read_attribute or write_attribute
|
7
|
-
# methods
|
6
|
+
# This cop checks for the use of the `read_attribute` or `write_attribute`
|
7
|
+
# methods and recommends square brackets instead.
|
8
8
|
#
|
9
9
|
# If an attribute is missing from the instance (for example, when
|
10
|
-
# initialized by a partial `select`) then read_attribute
|
11
|
-
# but square brackets will raise
|
10
|
+
# initialized by a partial `select`) then `read_attribute`
|
11
|
+
# will return nil, but square brackets will raise
|
12
|
+
# an `ActiveModel::MissingAttributeError`.
|
12
13
|
#
|
13
14
|
# Explicitly raising an error in this situation is preferable, and that
|
14
15
|
# is why rubocop recommends using square brackets.
|
@@ -21,20 +21,20 @@ module RuboCop
|
|
21
21
|
MSG = 'Prefer `%<assert_method>s` over `%<refute_method>s`.'.freeze
|
22
22
|
|
23
23
|
CORRECTIONS = {
|
24
|
-
refute:
|
25
|
-
refute_empty:
|
26
|
-
refute_equal:
|
27
|
-
refute_in_delta:
|
28
|
-
refute_in_epsilon:
|
29
|
-
refute_includes:
|
24
|
+
refute: 'assert_not',
|
25
|
+
refute_empty: 'assert_not_empty',
|
26
|
+
refute_equal: 'assert_not_equal',
|
27
|
+
refute_in_delta: 'assert_not_in_delta',
|
28
|
+
refute_in_epsilon: 'assert_not_in_epsilon',
|
29
|
+
refute_includes: 'assert_not_includes',
|
30
30
|
refute_instance_of: 'assert_not_instance_of',
|
31
|
-
refute_kind_of:
|
32
|
-
refute_nil:
|
33
|
-
refute_operator:
|
34
|
-
refute_predicate:
|
35
|
-
refute_respond_to:
|
36
|
-
refute_same:
|
37
|
-
refute_match:
|
31
|
+
refute_kind_of: 'assert_not_kind_of',
|
32
|
+
refute_nil: 'assert_not_nil',
|
33
|
+
refute_operator: 'assert_not_operator',
|
34
|
+
refute_predicate: 'assert_not_predicate',
|
35
|
+
refute_respond_to: 'assert_not_respond_to',
|
36
|
+
refute_same: 'assert_not_same',
|
37
|
+
refute_match: 'assert_no_match'
|
38
38
|
}.freeze
|
39
39
|
|
40
40
|
OFFENSIVE_METHODS = CORRECTIONS.keys.freeze
|
@@ -169,6 +169,7 @@ module RuboCop
|
|
169
169
|
def on_block(node)
|
170
170
|
return unless within_change_method?(node)
|
171
171
|
return if within_reversible_or_up_only_block?(node)
|
172
|
+
return if node.body.nil?
|
172
173
|
|
173
174
|
check_change_table_node(node.send_node, node.body)
|
174
175
|
end
|
@@ -238,7 +239,7 @@ module RuboCop
|
|
238
239
|
elsif block.send_type?
|
239
240
|
check_change_table_offense(arg, block)
|
240
241
|
else
|
241
|
-
block.each_child_node do |child_node|
|
242
|
+
block.each_child_node(:send) do |child_node|
|
242
243
|
check_change_table_offense(arg, child_node)
|
243
244
|
end
|
244
245
|
end
|