rubocop 1.18.2 → 1.19.1
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 +23 -6
- data/lib/rubocop.rb +4 -0
- data/lib/rubocop/cli.rb +18 -0
- data/lib/rubocop/config_loader.rb +1 -1
- data/lib/rubocop/config_loader_resolver.rb +22 -7
- data/lib/rubocop/config_validator.rb +18 -5
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +2 -0
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +71 -0
- data/lib/rubocop/cop/layout/class_structure.rb +5 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +9 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +10 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +22 -18
- 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/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +36 -22
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +22 -9
- data/lib/rubocop/cop/layout/space_around_operators.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +5 -5
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +24 -1
- 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/duplicate_branch.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +8 -5
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +6 -1
- data/lib/rubocop/cop/mixin/heredoc.rb +7 -0
- data/lib/rubocop/cop/mixin/percent_array.rb +13 -7
- data/lib/rubocop/cop/mixin/require_library.rb +59 -0
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +18 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +31 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +19 -5
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -7
- data/lib/rubocop/cop/style/double_negation.rb +12 -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 +32 -7
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +8 -2
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +11 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +0 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +30 -5
- 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/mutable_constant.rb +6 -8
- data/lib/rubocop/cop/style/redundant_begin.rb +25 -0
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +83 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/semicolon.rb +32 -24
- 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/sole_nested_conditional.rb +4 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +21 -0
- data/lib/rubocop/cop/style/symbol_array.rb +3 -3
- data/lib/rubocop/cop/style/word_array.rb +23 -5
- data/lib/rubocop/cop/util.rb +7 -2
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -1
- data/lib/rubocop/magic_comment.rb +44 -15
- data/lib/rubocop/options.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +15 -9
@@ -41,6 +41,7 @@ module RuboCop
|
|
41
41
|
#
|
42
42
|
class TrailingWhitespace < Base
|
43
43
|
include RangeHelp
|
44
|
+
include Heredoc
|
44
45
|
extend AutoCorrector
|
45
46
|
|
46
47
|
MSG = 'Trailing whitespace detected.'
|
@@ -54,6 +55,8 @@ module RuboCop
|
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
58
|
+
def on_heredoc(_node); end
|
59
|
+
|
57
60
|
private
|
58
61
|
|
59
62
|
def process_line(line, lineno)
|
@@ -63,13 +66,33 @@ module RuboCop
|
|
63
66
|
range = offense_range(lineno, line)
|
64
67
|
add_offense(range) do |corrector|
|
65
68
|
if heredoc
|
66
|
-
corrector
|
69
|
+
process_line_in_heredoc(corrector, range, heredoc)
|
67
70
|
else
|
68
71
|
corrector.remove(range)
|
69
72
|
end
|
70
73
|
end
|
71
74
|
end
|
72
75
|
|
76
|
+
def process_line_in_heredoc(corrector, range, heredoc)
|
77
|
+
indent_level = indent_level(find_heredoc(range.line).loc.heredoc_body.source)
|
78
|
+
whitespace_only = whitespace_only?(range)
|
79
|
+
if whitespace_only && whitespace_is_indentation?(range, indent_level)
|
80
|
+
corrector.remove(range)
|
81
|
+
elsif !static?(heredoc)
|
82
|
+
range = range_between(range.begin_pos + indent_level, range.end_pos) if whitespace_only
|
83
|
+
corrector.wrap(range, "\#{'", "'}")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def whitespace_is_indentation?(range, level)
|
88
|
+
range.source[/ +/].length <= level
|
89
|
+
end
|
90
|
+
|
91
|
+
def whitespace_only?(range)
|
92
|
+
source = range_with_surrounding_space(range: range).source
|
93
|
+
source.start_with?("\n") && source.end_with?("\n")
|
94
|
+
end
|
95
|
+
|
73
96
|
def static?(heredoc)
|
74
97
|
heredoc.loc.expression.source.end_with? "'"
|
75
98
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for ambiguous ranges.
|
7
|
+
#
|
8
|
+
# Ranges have quite low precedence, which leads to unexpected behaviour when
|
9
|
+
# using a range with other operators. This cop avoids that by making ranges
|
10
|
+
# explicit by requiring parenthesis around complex range boundaries (anything
|
11
|
+
# that is not a basic literal: numerics, strings, symbols, etc.).
|
12
|
+
#
|
13
|
+
# NOTE: The cop auto-corrects by wrapping the entire boundary in parentheses, which
|
14
|
+
# makes the outcome more explicit but is possible to not be the intention of the
|
15
|
+
# programmer. For this reason, this cop's auto-correct is marked as unsafe (it
|
16
|
+
# will not change the behaviour of the code, but will not necessarily match the
|
17
|
+
# intent of the program).
|
18
|
+
#
|
19
|
+
# This cop can be configured with `RequireParenthesesForMethodChains` in order to
|
20
|
+
# specify whether method chains (including `self.foo`) should be wrapped in parens
|
21
|
+
# by this cop.
|
22
|
+
#
|
23
|
+
# NOTE: Regardless of this configuration, if a method receiver is a basic literal
|
24
|
+
# value, it will be wrapped in order to prevent the ambiguity of `1..2.to_a`.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# # bad
|
28
|
+
# x || 1..2
|
29
|
+
# (x || 1..2)
|
30
|
+
# 1..2.to_a
|
31
|
+
#
|
32
|
+
# # good, unambiguous
|
33
|
+
# 1..2
|
34
|
+
# 'a'..'z'
|
35
|
+
# :bar..:baz
|
36
|
+
# MyClass::MIN..MyClass::MAX
|
37
|
+
# @min..@max
|
38
|
+
# a..b
|
39
|
+
# -a..b
|
40
|
+
#
|
41
|
+
# # good, ambiguity removed
|
42
|
+
# x || (1..2)
|
43
|
+
# (x || 1)..2
|
44
|
+
# (x || 1)..(y || 2)
|
45
|
+
# (1..2).to_a
|
46
|
+
#
|
47
|
+
# @example RequireParenthesesForMethodChains: false (default)
|
48
|
+
# # good
|
49
|
+
# a.foo..b.bar
|
50
|
+
# (a.foo)..(b.bar)
|
51
|
+
#
|
52
|
+
# @example RequireParenthesesForMethodChains: true
|
53
|
+
# # bad
|
54
|
+
# a.foo..b.bar
|
55
|
+
#
|
56
|
+
# # good
|
57
|
+
# (a.foo)..(b.bar)
|
58
|
+
#
|
59
|
+
class AmbiguousRange < Base
|
60
|
+
extend AutoCorrector
|
61
|
+
|
62
|
+
MSG = 'Wrap complex range boundaries with parentheses to avoid ambiguity.'
|
63
|
+
|
64
|
+
def on_irange(node)
|
65
|
+
each_boundary(node) do |boundary|
|
66
|
+
next if acceptable?(boundary)
|
67
|
+
|
68
|
+
add_offense(boundary) do |corrector|
|
69
|
+
corrector.wrap(boundary, '(', ')')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
alias on_erange on_irange
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def each_boundary(range)
|
78
|
+
yield range.begin if range.begin
|
79
|
+
yield range.end if range.end
|
80
|
+
end
|
81
|
+
|
82
|
+
def acceptable?(node)
|
83
|
+
node.begin_type? ||
|
84
|
+
node.basic_literal? ||
|
85
|
+
node.variable? || node.const_type? ||
|
86
|
+
node.call_type? && acceptable_call?(node)
|
87
|
+
end
|
88
|
+
|
89
|
+
def acceptable_call?(node)
|
90
|
+
return true if node.unary_operation?
|
91
|
+
|
92
|
+
# Require parentheses when making a method call on a literal
|
93
|
+
# to avoid the ambiguity of `1..2.to_a`.
|
94
|
+
return false if node.receiver&.basic_literal?
|
95
|
+
|
96
|
+
require_parentheses_for_method_chain? || node.receiver.nil?
|
97
|
+
end
|
98
|
+
|
99
|
+
def require_parentheses_for_method_chain?
|
100
|
+
!cop_config['RequireParenthesesForMethodChains']
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -46,12 +46,11 @@ module RuboCop
|
|
46
46
|
node = processed_source.ast.each_node(:regexp).find do |regexp_node|
|
47
47
|
regexp_node.source_range.begin_pos == diagnostic.location.begin_pos
|
48
48
|
end
|
49
|
-
|
50
49
|
find_offense_node(node.parent, node)
|
51
50
|
end
|
52
51
|
|
53
52
|
def find_offense_node(node, regexp_receiver)
|
54
|
-
return node
|
53
|
+
return node if first_argument_is_regexp?(node) || !node.parent
|
55
54
|
|
56
55
|
if (node.parent.send_type? && node.receiver) ||
|
57
56
|
method_chain_to_regexp_receiver?(node, regexp_receiver)
|
@@ -61,6 +60,10 @@ module RuboCop
|
|
61
60
|
node
|
62
61
|
end
|
63
62
|
|
63
|
+
def first_argument_is_regexp?(node)
|
64
|
+
node.send_type? && node.first_argument&.regexp_type?
|
65
|
+
end
|
66
|
+
|
64
67
|
def method_chain_to_regexp_receiver?(node, regexp_receiver)
|
65
68
|
return false unless (parent = node.parent)
|
66
69
|
return false unless (parent_receiver = parent.receiver)
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
6
|
# This cop checks that there are no repeated bodies
|
7
|
-
# within `if/unless`, `case-when` and `rescue` constructs.
|
7
|
+
# within `if/unless`, `case-when`, `case-in` and `rescue` constructs.
|
8
8
|
#
|
9
9
|
# With `IgnoreLiteralBranches: true`, branches are not registered
|
10
10
|
# as offenses if they return a basic literal value (string, symbol,
|
@@ -97,6 +97,7 @@ module RuboCop
|
|
97
97
|
end
|
98
98
|
alias on_if on_branching_statement
|
99
99
|
alias on_case on_branching_statement
|
100
|
+
alias on_case_match on_branching_statement
|
100
101
|
alias on_rescue on_branching_statement
|
101
102
|
|
102
103
|
private
|
@@ -135,11 +135,14 @@ module RuboCop
|
|
135
135
|
def found_instance_method(node, name)
|
136
136
|
return unless (scope = node.parent_module_name)
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
138
|
+
# Humanize the scope
|
139
|
+
scope = scope.sub(
|
140
|
+
/(?:(?<name>.*)::)#<Class:\k<name>>|#<Class:(?<name>.*)>(?:::)?/,
|
141
|
+
'\k<name>.'
|
142
|
+
)
|
143
|
+
scope << '#' unless scope.end_with?('.')
|
144
|
+
|
145
|
+
found_method(node, "#{scope}#{name}")
|
143
146
|
end
|
144
147
|
|
145
148
|
def found_method(node, method_name)
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
return if block_reassigns_arg?(node, block_arg)
|
82
82
|
|
83
83
|
source = node.body.source
|
84
|
-
source.gsub!(/\b#{block_arg}\b/, '
|
84
|
+
source.gsub!(/\b#{block_arg}\b/, '0') if block_arg
|
85
85
|
|
86
86
|
corrector.replace(node, fix_indentation(source, node.loc.column...node.body.loc.column))
|
87
87
|
end
|
@@ -97,9 +97,9 @@ module RuboCop
|
|
97
97
|
# If a send node contains a heredoc argument, splitting cannot happen
|
98
98
|
# after the heredoc or else it will cause a syntax error.
|
99
99
|
def shift_elements_for_heredoc_arg(node, elements, index)
|
100
|
-
return index unless node.send_type?
|
100
|
+
return index unless node.send_type? || node.array_type?
|
101
101
|
|
102
|
-
heredoc_index = elements.index { |arg|
|
102
|
+
heredoc_index = elements.index { |arg| arg.respond_to?(:heredoc?) && arg.heredoc? }
|
103
103
|
return index unless heredoc_index
|
104
104
|
return nil if heredoc_index.zero?
|
105
105
|
|
@@ -175,7 +175,12 @@ module RuboCop
|
|
175
175
|
end
|
176
176
|
|
177
177
|
def set_new_body_expression(transforming_body_expr, corrector)
|
178
|
-
|
178
|
+
body_source = transforming_body_expr.loc.expression.source
|
179
|
+
if transforming_body_expr.hash_type? && !transforming_body_expr.braces?
|
180
|
+
body_source = "{ #{body_source} }"
|
181
|
+
end
|
182
|
+
|
183
|
+
corrector.replace(block_node.body, body_source)
|
179
184
|
end
|
180
185
|
end
|
181
186
|
end
|
@@ -20,6 +20,13 @@ module RuboCop
|
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
+
def indent_level(str)
|
24
|
+
indentations = str.lines
|
25
|
+
.map { |line| line[/^\s*/] }
|
26
|
+
.reject { |line| line.end_with?("\n") }
|
27
|
+
indentations.empty? ? 0 : indentations.min_by(&:size).size
|
28
|
+
end
|
29
|
+
|
23
30
|
def delimiter_string(node)
|
24
31
|
node.source.match(OPENING_DELIMITER).captures[1]
|
25
32
|
end
|
@@ -18,15 +18,16 @@ module RuboCop
|
|
18
18
|
!parent.parenthesized? && parent&.block_literal?
|
19
19
|
end
|
20
20
|
|
21
|
+
# Override to determine values that are invalid in a percent array
|
22
|
+
def invalid_percent_array_contents?(_node)
|
23
|
+
false
|
24
|
+
end
|
25
|
+
|
21
26
|
def allowed_bracket_array?(node)
|
22
27
|
comments_in_array?(node) || below_array_length?(node) ||
|
23
28
|
invalid_percent_array_context?(node)
|
24
29
|
end
|
25
30
|
|
26
|
-
def message(_node)
|
27
|
-
style == :percent ? self.class::PERCENT_MSG : self.class::ARRAY_MSG
|
28
|
-
end
|
29
|
-
|
30
31
|
def comments_in_array?(node)
|
31
32
|
line_span = node.source_range.first_line...node.source_range.last_line
|
32
33
|
processed_source.each_comment_in_lines(line_span).any?
|
@@ -35,9 +36,14 @@ module RuboCop
|
|
35
36
|
def check_percent_array(node)
|
36
37
|
array_style_detected(:percent, node.values.size)
|
37
38
|
|
38
|
-
return unless style == :brackets
|
39
|
+
return unless style == :brackets || invalid_percent_array_contents?(node)
|
40
|
+
|
41
|
+
bracketed_array = build_bracketed_array(node)
|
42
|
+
message = format(self.class::ARRAY_MSG, prefer: bracketed_array)
|
39
43
|
|
40
|
-
add_offense(node)
|
44
|
+
add_offense(node, message: message) do |corrector|
|
45
|
+
corrector.replace(node, bracketed_array)
|
46
|
+
end
|
41
47
|
end
|
42
48
|
|
43
49
|
def check_bracketed_array(node, literal_prefix)
|
@@ -47,7 +53,7 @@ module RuboCop
|
|
47
53
|
|
48
54
|
return unless style == :percent
|
49
55
|
|
50
|
-
add_offense(node) do |corrector|
|
56
|
+
add_offense(node, message: self.class::PERCENT_MSG) do |corrector|
|
51
57
|
percent_literal_corrector = PercentLiteralCorrector.new(@config, @preferred_delimiters)
|
52
58
|
percent_literal_corrector.correct(corrector, node, literal_prefix)
|
53
59
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Ensure a require statement is present for a standard library determined
|
6
|
+
# by variable library_name
|
7
|
+
module RequireLibrary
|
8
|
+
extend NodePattern::Macros
|
9
|
+
|
10
|
+
def ensure_required(corrector, node, library_name)
|
11
|
+
node = node.parent while node.parent&.parent?
|
12
|
+
|
13
|
+
if node.parent&.begin_type?
|
14
|
+
return if @required_libs.include?(library_name)
|
15
|
+
|
16
|
+
remove_subsequent_requires(corrector, node, library_name)
|
17
|
+
end
|
18
|
+
|
19
|
+
RequireLibraryCorrector.correct(corrector, node, library_name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove_subsequent_requires(corrector, node, library_name)
|
23
|
+
node.right_siblings.each do |sibling|
|
24
|
+
next unless require_library_name?(sibling, library_name)
|
25
|
+
|
26
|
+
range = range_by_whole_lines(sibling.source_range, include_final_newline: true)
|
27
|
+
corrector.remove(range)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_send(node)
|
32
|
+
return if node.parent&.parent?
|
33
|
+
|
34
|
+
name = require_any_library?(node)
|
35
|
+
return if name.nil?
|
36
|
+
|
37
|
+
@required_libs.add(name)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def on_new_investigation
|
43
|
+
# Holds the required files at top-level
|
44
|
+
@required_libs = Set.new
|
45
|
+
super
|
46
|
+
end
|
47
|
+
|
48
|
+
# @!method require_any_library?(node)
|
49
|
+
def_node_matcher :require_any_library?, <<~PATTERN
|
50
|
+
(send {(const {nil? cbase} :Kernel) nil?} :require (str $_))
|
51
|
+
PATTERN
|
52
|
+
|
53
|
+
# @!method require_library_name?(node, library_name)
|
54
|
+
def_node_matcher :require_library_name?, <<~PATTERN
|
55
|
+
(send {(const {nil? cbase} :Kernel) nil?} :require (str %1))
|
56
|
+
PATTERN
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
MSG = 'Space found before %<token>s.'
|
11
11
|
|
12
12
|
def on_new_investigation
|
13
|
-
each_missing_space(processed_source.
|
13
|
+
each_missing_space(processed_source.sorted_tokens) do |token, pos_before|
|
14
14
|
add_offense(pos_before, message: format(MSG, token: kind(token))) do |corrector|
|
15
15
|
PunctuationCorrector.remove_space(corrector, pos_before)
|
16
16
|
end
|
@@ -19,6 +19,8 @@ module RuboCop
|
|
19
19
|
# Regex can be specified to identify offenses. Suggestions for replacing a flagged term can
|
20
20
|
# be configured and will be displayed as part of the offense message.
|
21
21
|
# An AllowedRegex can be specified for a flagged term to exempt allowed uses of the term.
|
22
|
+
# `WholeWord: true` can be set on a flagged term to indicate the cop should only match when
|
23
|
+
# a term matches the whole word (partial matches will not be offenses).
|
22
24
|
#
|
23
25
|
# @example FlaggedTerms: { whitelist: { Suggestions: ['allowlist'] } }
|
24
26
|
# # Suggest replacing identifier whitelist with allowlist
|
@@ -56,6 +58,14 @@ module RuboCop
|
|
56
58
|
# # good
|
57
59
|
# # They had a master's degree
|
58
60
|
#
|
61
|
+
# @example FlaggedTerms: { slave: { WholeWord: true } }
|
62
|
+
# # Specify that only terms that are full matches will be flagged.
|
63
|
+
#
|
64
|
+
# # bad
|
65
|
+
# Slave
|
66
|
+
#
|
67
|
+
# # good (won't be flagged despite containing `slave`)
|
68
|
+
# TeslaVehicle
|
59
69
|
class InclusiveLanguage < Base
|
60
70
|
include RangeHelp
|
61
71
|
|
@@ -123,7 +133,7 @@ module RuboCop
|
|
123
133
|
next if term_definition.nil?
|
124
134
|
|
125
135
|
allowed_strings.concat(process_allowed_regex(term_definition['AllowedRegex']))
|
126
|
-
regex_string = ensure_regex_string(term_definition
|
136
|
+
regex_string = ensure_regex_string(extract_regexp(term, term_definition))
|
127
137
|
flagged_term_strings << regex_string
|
128
138
|
|
129
139
|
add_to_flagged_term_hash(regex_string, term, term_definition)
|
@@ -132,6 +142,13 @@ module RuboCop
|
|
132
142
|
set_regexes(flagged_term_strings, allowed_strings)
|
133
143
|
end
|
134
144
|
|
145
|
+
def extract_regexp(term, term_definition)
|
146
|
+
return term_definition['Regex'] if term_definition['Regex']
|
147
|
+
return /(?:\b|(?<=[\W_]))#{term}(?:\b|(?=[\W_]))/ if term_definition['WholeWord']
|
148
|
+
|
149
|
+
term
|
150
|
+
end
|
151
|
+
|
135
152
|
def add_to_flagged_term_hash(regex_string, term, term_definition)
|
136
153
|
@flagged_term_hash[Regexp.new(regex_string, Regexp::IGNORECASE)] =
|
137
154
|
term_definition.merge('Term' => term,
|