betterlint 1.4.9 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d607b36a006c41af535225cf9ea3c32771dae29a2cc6bee9092f50d8fc6cab0c
4
- data.tar.gz: 9cea34ee8efe8657ba6387b08001a95301e61af4a0e0be69a653de02e7d41cbb
3
+ metadata.gz: 71ba27a1b021ee2c1543aba5603245ae2631a64525c7c7e5338457b1296c66a6
4
+ data.tar.gz: e3c21186976d7d503c890cd4e0c8fed99d5c6f6ae20071a17fa697e9c4928ea7
5
5
  SHA512:
6
- metadata.gz: efb8a0837eef49c7a41152194b21fa6e004923a4705812365234375bfc05140bda6bdf25742c4e1e8d6ad002b2940885b8a9c46dfbfa56864bf4bfbe3a18b583
7
- data.tar.gz: e4d1fdb860e7f9806f1f0e0593999ac998a34345a159de8c2e1030b3464f42473e9ef8d9d3911720898fba489d42690d29ff47b777921bff7ebc80afabdab14e
6
+ metadata.gz: '048543b98c55befe6f306446a132f6f561598bf19ab9ffc4f74c6eb90b7ea5aa1d78d56594c34a2c8c6da7d79462329b8dadc8868af620fe53084189e7f6d604'
7
+ data.tar.gz: 35388c596e5edc116860dd60796313b9d6569326e77929b5e05b0f48f6f13067534684ec9d37904e140ba4b2dea93f8e243e10ead8196ee1eaba34e6b600d898
data/config/default.yml CHANGED
@@ -292,7 +292,7 @@ Style/Documentation:
292
292
  Enabled: false
293
293
 
294
294
  Style/FrozenStringLiteralComment:
295
- Enabled: false
295
+ Enabled: true
296
296
 
297
297
  Style/GuardClause:
298
298
  Enabled: false
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class ActiveJobPerformable < Cop
5
- MSG = <<~DOC.freeze
7
+ MSG = <<~DOC
6
8
  Classes that are "performable" should be ActiveJobs
7
9
 
8
10
  class MyJob < ApplicationJob
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # rubocop:disable Betterment/AllowlistBlocklist
2
4
  module RuboCop
3
5
  module Cop
4
6
  module Betterment
5
7
  class AllowlistBlocklist < Cop
6
- MSG = <<-DOC.freeze
8
+ MSG = <<-DOC
7
9
  Avoid usages of whitelist & blacklist, in favor of more inclusive and descriptive language.
8
10
  For consistency, favor 'allowlist' and 'blocklist' where possible, but other terms (such as
9
11
  denylist, ignorelist, warnlist, safelist, etc) may be appropriate, depending on the use case.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
@@ -5,7 +7,7 @@ module RuboCop
5
7
  attr_accessor :unsafe_parameters, :unsafe_regex
6
8
 
7
9
  # MSG_UNSAFE_CREATE = 'Model created/updated using unsafe parameters'.freeze
8
- MSG_UNSAFE_CREATE = <<~MSG.freeze
10
+ MSG_UNSAFE_CREATE = <<~MSG
9
11
  Model created/updated using unsafe parameters.
10
12
  Please query for the associated record in a way that enforces authorization (e.g. "trust-root chaining"),
11
13
  and then pass the resulting object into your model instead of the unsafe parameter.
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class DynamicParams < Cop
5
- MSG_DYNAMIC_PARAMS = <<~MSG.freeze
7
+ MSG_DYNAMIC_PARAMS = <<~MSG
6
8
  Parameter names accessed dynamically, cannot determine safeness. Please inline the keys explicitly when calling `permit` or when accessing `params` like a hash.
7
9
 
8
10
  See here for more information on this error:
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
@@ -5,7 +7,7 @@ module RuboCop
5
7
  include RangeHelp
6
8
  extend AutoCorrector
7
9
 
8
- MSG = 'Hardcoded IDs cause flaky tests. Use a sequence instead.'.freeze
10
+ MSG = 'Hardcoded IDs cause flaky tests. Use a sequence instead.'
9
11
 
10
12
  # @!method key(node)
11
13
  def_node_matcher :key, '/^id$|_id$/'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
@@ -13,10 +15,10 @@ module RuboCop
13
15
  # get '/', redirect('/dashboard', status: 301)
14
16
  # get(status: 302) { |params, request| '/dashboard' }
15
17
  class ImplicitRedirectType < Cop
16
- ROUTES_FILE_NAME = 'routes.rb'.freeze
18
+ ROUTES_FILE_NAME = 'routes.rb'
17
19
  MSG =
18
20
  'Rails will create a permanent (301) redirect, which is dangerous. ' \
19
- 'Please specify your desired status, e.g. redirect(..., status: 302)'.freeze
21
+ 'Please specify your desired status, e.g. redirect(..., status: 302)'
20
22
 
21
23
  # redirect('/')
22
24
  def_node_matcher :arg_form_without_options?, <<-PATTERN
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class MemoizationWithArguments < Cop
5
7
  MSG = 'Memoized method `%<method>s` accepts arguments, ' \
6
8
  'which may cause it to return a stale result. ' \
7
- 'Remove memoization or refactor to remove arguments.'.freeze
9
+ 'Remove memoization or refactor to remove arguments.'
8
10
 
9
11
  def self.node_pattern
10
12
  memo_assign = '(or_asgn $(ivasgn _) _)'
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class NonStandardActions < Cop
5
- MSG_GENERAL = 'Use a new controller instead of custom actions.'.freeze
7
+ MSG_GENERAL = 'Use a new controller instead of custom actions.'
6
8
  MSG_RESOURCE_ONLY = "Resource route refers to a non-standard action in it's 'only:' param. #{MSG_GENERAL}".freeze
7
9
  MSG_ROUTE_TO = "Route goes to a non-standard controller action. #{MSG_GENERAL}".freeze
8
10
 
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class SitePrismLoaded < Cop
5
- MSG = 'Use `be_loaded` instead of `be_displayed`'.freeze
7
+ MSG = 'Use `be_loaded` instead of `be_displayed`'
6
8
 
7
9
  def_node_matcher :be_displayed_call?, <<-PATTERN
8
10
  (send (send nil? :expect _) _ (send nil? :be_displayed))
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
@@ -13,7 +15,7 @@ module RuboCop
13
15
  # spec/models/my_class_spec.rb
14
16
  # require 'rails_helper'
15
17
  class SpecHelperRequiredOutsideSpecDir < Cop
16
- MSG = 'Spec helper required outside of a spec/ directory.'.freeze
18
+ MSG = 'Spec helper required outside of a spec/ directory.'
17
19
 
18
20
  def_node_matcher :requires_spec_helper?, <<-PATTERN
19
21
  (send nil? :require
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class Timeout < Cop
5
- MSG = 'Using Timeout.timeout without a custom exception can prevent rescue blocks from executing'.freeze
7
+ MSG = 'Using Timeout.timeout without a custom exception can prevent rescue blocks from executing'
6
8
 
7
9
  def_node_matcher :timeout_call?, <<-PATTERN
8
10
  (send (const nil? :Timeout) :timeout _)
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class UnsafeJob < Cop
5
7
  attr_accessor :sensitive_params, :class_regex
6
8
 
7
- MSG = <<~MSG.freeze
9
+ MSG = <<~MSG
8
10
  This job takes a parameter that will end up serialized in plaintext. Do not pass sensitive data as bare arguments into jobs.
9
11
 
10
12
  See here for more information on this error:
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class UnscopedFind < Cop
5
7
  attr_accessor :unauthenticated_models
6
8
 
7
- MSG = <<~MSG.freeze
9
+ MSG = <<~MSG
8
10
  Records are being retrieved directly using user input.
9
11
  Please query for the associated record in a way that enforces authorization (e.g. "trust-root chaining").
10
12
 
@@ -17,7 +19,7 @@ module RuboCop
17
19
  See here for more information on this error:
18
20
  https://github.com/Betterment/betterlint/blob/main/README.md#bettermentunscopedfind
19
21
  MSG
20
- METHOD_PATTERN = /^find_by_(.+?)(!)?$/.freeze
22
+ METHOD_PATTERN = /^find_by_(.+?)(!)?$/
21
23
  FINDS = %i(find find_by find_by! where).freeze
22
24
 
23
25
  def_node_matcher :custom_scope_find?, <<-PATTERN
@@ -1,74 +1,78 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
- module Utils
4
- class HardcodedAttribute
5
- extend RuboCop::NodePattern::Macros
5
+ module Betterment
6
+ module Utils
7
+ class HardcodedAttribute
8
+ extend RuboCop::NodePattern::Macros
6
9
 
7
- attr_reader :node, :let_node, :let_name
10
+ attr_reader :node, :let_node, :let_name
8
11
 
9
- def initialize(node)
10
- @node = node
11
- @let_node = node.parent&.parent&.parent
12
- @let_name = extract_let_name(@let_node)
13
- end
12
+ def initialize(node)
13
+ @node = node
14
+ @let_node = node.parent&.parent&.parent
15
+ @let_name = extract_let_name(@let_node)
16
+ end
14
17
 
15
- def correctable?
16
- key == :id && !let_name.nil?
17
- end
18
+ def correctable?
19
+ key == :id && !let_name.nil?
20
+ end
18
21
 
19
- def replacement
20
- "#{let_name}.#{key}"
21
- end
22
+ def replacement
23
+ "#{let_name}.#{key}"
24
+ end
22
25
 
23
- def each_integer_reference
24
- each_possible_reference(:int) do |ref|
25
- yield ref if ref.value == value
26
+ def each_integer_reference
27
+ each_possible_reference(:int) do |ref|
28
+ yield ref if ref.value == value
29
+ end
26
30
  end
27
- end
28
31
 
29
- def each_string_reference
30
- each_possible_reference(:str) do |ref|
31
- yield ref if ref.value.match?(value_pattern)
32
+ def each_string_reference
33
+ each_possible_reference(:str) do |ref|
34
+ yield ref if ref.value.match?(value_pattern)
35
+ end
32
36
  end
33
- end
34
37
 
35
- def each_range_within_string(reference)
36
- reference.source.enum_for(:scan, value_pattern).each do
37
- yield create_range(reference, Regexp.last_match)
38
+ def each_range_within_string(reference)
39
+ reference.source.enum_for(:scan, value_pattern).each do
40
+ yield create_range(reference, Regexp.last_match)
41
+ end
38
42
  end
39
- end
40
43
 
41
- private
44
+ private
42
45
 
43
- def create_range(node, match)
44
- range = node.source_range
45
- begin_pos = range.begin_pos + match.begin(0)
46
- end_pos = range.begin_pos + match.end(0)
47
- range.with(begin_pos: begin_pos, end_pos: end_pos)
48
- end
46
+ def create_range(node, match)
47
+ range = node.source_range
48
+ begin_pos = range.begin_pos + match.begin(0)
49
+ end_pos = range.begin_pos + match.end(0)
50
+ range.with(begin_pos: begin_pos, end_pos: end_pos)
51
+ end
49
52
 
50
- def key
51
- node.key.value
52
- end
53
+ def key
54
+ node.key.value
55
+ end
53
56
 
54
- def value
55
- node.value.value.to_i
56
- end
57
+ def value
58
+ node.value.value.to_i
59
+ end
57
60
 
58
- def value_pattern
59
- /\b#{value}\b/
60
- end
61
+ def value_pattern
62
+ /\b#{value}\b/
63
+ end
61
64
 
62
- def each_possible_reference(type, &block)
63
- let_node.parent.each_descendant(:block) do |block_node|
64
- block_node.each_descendant(type, &block) unless block_node == let_node
65
+ def each_possible_reference(type, &block)
66
+ let_node.parent.each_descendant(:block) do |block_node|
67
+ block_node.each_descendant(type, &block) unless block_node == let_node
68
+ end
65
69
  end
66
- end
67
70
 
68
- # @!method extract_let_name(node)
69
- def_node_matcher :extract_let_name, <<~PATTERN
70
- (block (send nil? {:let | :let!} (sym $_let_name)) _block_args _block_body)
71
- PATTERN
71
+ # @!method extract_let_name(node)
72
+ def_node_matcher :extract_let_name, <<~PATTERN
73
+ (block (send nil? {:let | :let!} (sym $_let_name)) _block_args _block_body)
74
+ PATTERN
75
+ end
72
76
  end
73
77
  end
74
78
  end
@@ -1,45 +1,49 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
- module Utils
4
- module MethodReturnTable
5
- class << self
6
- def populate_index(node)
7
- raise "not a class" unless node.class_type?
8
-
9
- get_methods_for_class(node).each do |method|
10
- track_method(method.method_name, Utils::Parser.get_return_values(method))
5
+ module Betterment
6
+ module Utils
7
+ module MethodReturnTable
8
+ class << self
9
+ def populate_index(node)
10
+ raise "not a class" unless node.class_type?
11
+
12
+ get_methods_for_class(node).each do |method|
13
+ track_method(method.method_name, Utils::Parser.get_return_values(method))
14
+ end
15
+
16
+ node.descendants.each do |descendant|
17
+ lhs, rhs = *descendant
18
+ next unless descendant.equals_asgn? && (descendant.type != :casgn) && rhs&.send_type?
19
+
20
+ track_method(lhs, [rhs])
21
+ end
11
22
  end
12
23
 
13
- node.descendants.each do |descendant|
14
- lhs, rhs = *descendant
15
- next unless descendant.equals_asgn? && (descendant.type != :casgn) && rhs&.send_type?
16
-
17
- track_method(lhs, [rhs])
24
+ def indexed_methods
25
+ @indexed_methods ||= {}
18
26
  end
19
- end
20
27
 
21
- def indexed_methods
22
- @indexed_methods ||= {}
23
- end
24
-
25
- def get_method(method_name)
26
- indexed_methods[method_name]
27
- end
28
+ def get_method(method_name)
29
+ indexed_methods[method_name]
30
+ end
28
31
 
29
- def has_method?(method_name)
30
- indexed_methods.include?(method_name)
31
- end
32
+ def has_method?(method_name)
33
+ indexed_methods.include?(method_name)
34
+ end
32
35
 
33
- private
36
+ private
34
37
 
35
- def track_method(method_name, returns)
36
- indexed_methods[method_name] = returns
37
- end
38
+ def track_method(method_name, returns)
39
+ indexed_methods[method_name] = returns
40
+ end
38
41
 
39
- def get_methods_for_class(node)
40
- return [] unless node.children && node.class_type?
42
+ def get_methods_for_class(node)
43
+ return [] unless node.children && node.class_type?
41
44
 
42
- node.descendants.select(&:def_type?)
45
+ node.descendants.select(&:def_type?)
46
+ end
43
47
  end
44
48
  end
45
49
  end
@@ -1,113 +1,117 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
- module Utils
4
- module Parser
5
- def self.get_root_token(node) # rubocop:disable Metrics/PerceivedComplexity, Metrics/AbcSize
6
- return nil unless node
7
-
8
- return get_root_token(node.receiver) if node.receiver
9
-
10
- # rubocop:disable InternalAffairs/NodeDestructuring
11
- if node.send_type?
12
- name = node.method_name
13
- elsif node.variable?
14
- name, = *node
15
- elsif node.literal?
16
- _, name = *node
17
- elsif node.const_type?
18
- name = node.const_name.to_sym
19
- elsif node.sym_type?
20
- name = node.value
21
- elsif node.self_type?
22
- name = :self
23
- elsif node.block_pass_type?
24
- name, = *node.children
25
- else
26
- name = nil
27
- end
28
- # rubocop:enable InternalAffairs/NodeDestructuring
29
-
30
- name
31
- end
32
-
33
- def self.get_return_values(node) # rubocop:disable Metrics/AbcSize
34
- return [] unless node
35
- return explicit_returns(node) + get_return_values(node.body) if node.def_type?
36
- return [node] if node.literal? || node.variable?
37
-
38
- case node.type
39
- when :begin
40
- get_return_values(node.children.last)
41
- when :block
42
- get_return_values(node.body)
43
- when :if
44
- if_rets = get_return_values(node.if_branch)
45
- else_rets = get_return_values(node.else_branch)
46
- if_rets + else_rets
47
- when :case
48
- cases = []
49
- node.each_when do |block|
50
- cases += get_return_values(block.body)
51
- end
52
-
53
- cases + get_return_values(node.else_branch)
54
- when :send
55
- [node]
5
+ module Betterment
6
+ module Utils
7
+ module Parser
8
+ def self.get_root_token(node) # rubocop:disable Metrics/PerceivedComplexity, Metrics/AbcSize
9
+ return nil unless node
10
+
11
+ return get_root_token(node.receiver) if node.receiver
12
+
13
+ # rubocop:disable InternalAffairs/NodeDestructuring
14
+ if node.send_type?
15
+ name = node.method_name
16
+ elsif node.variable?
17
+ name, = *node
18
+ elsif node.literal?
19
+ _, name = *node
20
+ elsif node.const_type?
21
+ name = node.const_name.to_sym
22
+ elsif node.sym_type?
23
+ name = node.value
24
+ elsif node.self_type?
25
+ name = :self
26
+ elsif node.block_pass_type?
27
+ name, = *node.children
56
28
  else
57
- []
29
+ name = nil
30
+ end
31
+ # rubocop:enable InternalAffairs/NodeDestructuring
32
+
33
+ name
58
34
  end
59
- end
60
35
 
61
- def self.explicit_returns(node)
62
- node.descendants.select(&:return_type?).filter_map do |x|
63
- x&.children&.first
36
+ def self.get_return_values(node) # rubocop:disable Metrics/AbcSize
37
+ return [] unless node
38
+ return explicit_returns(node) + get_return_values(node.body) if node.def_type?
39
+ return [node] if node.literal? || node.variable?
40
+
41
+ case node.type
42
+ when :begin
43
+ get_return_values(node.children.last)
44
+ when :block
45
+ get_return_values(node.body)
46
+ when :if
47
+ if_rets = get_return_values(node.if_branch)
48
+ else_rets = get_return_values(node.else_branch)
49
+ if_rets + else_rets
50
+ when :case
51
+ cases = []
52
+ node.each_when do |block|
53
+ cases += get_return_values(block.body)
54
+ end
55
+
56
+ cases + get_return_values(node.else_branch)
57
+ when :send
58
+ [node]
59
+ else
60
+ []
61
+ end
64
62
  end
65
- end
66
63
 
67
- def self.params_from_arguments(arguments) # rubocop:disable Metrics/PerceivedComplexity
68
- parameter_names = []
64
+ def self.explicit_returns(node)
65
+ node.descendants.select(&:return_type?).filter_map do |x|
66
+ x&.children&.first
67
+ end
68
+ end
69
69
 
70
- arguments.each do |arg|
71
- if arg.hash_type?
72
- arg.children.each do |pair|
73
- value = pair.value
74
- parameter_names << value.value if value.sym_type? || value.str_type?
70
+ def self.params_from_arguments(arguments) # rubocop:disable Metrics/PerceivedComplexity
71
+ parameter_names = []
72
+
73
+ arguments.each do |arg|
74
+ if arg.hash_type?
75
+ arg.children.each do |pair|
76
+ value = pair.value
77
+ parameter_names << value.value if value.sym_type? || value.str_type?
78
+ end
79
+ elsif arg.sym_type? || arg.str_type?
80
+ parameter_names << arg.value
75
81
  end
76
- elsif arg.sym_type? || arg.str_type?
77
- parameter_names << arg.value
78
82
  end
83
+
84
+ parameter_names
79
85
  end
80
86
 
81
- parameter_names
82
- end
87
+ def self.get_extracted_parameters(node, param_aliases: []) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
88
+ return [] unless node.send_type?
83
89
 
84
- def self.get_extracted_parameters(node, param_aliases: []) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
85
- return [] unless node.send_type?
90
+ parameter_names = []
91
+ param_aliases << :params
86
92
 
87
- parameter_names = []
88
- param_aliases << :params
93
+ if node.method?(:[]) && param_aliases.include?(get_root_token(node))
94
+ return node.arguments.select { |x|
95
+ x.sym_type? || x.str_type?
96
+ }.map(&:value)
97
+ end
89
98
 
90
- if node.method?(:[]) && param_aliases.include?(get_root_token(node))
91
- return node.arguments.select { |x|
92
- x.sym_type? || x.str_type?
93
- }.map(&:value)
94
- end
99
+ children = node.descendants.select do |child|
100
+ child.send_type? && param_aliases.include?(child.method_name)
101
+ end
95
102
 
96
- children = node.descendants.select do |child|
97
- child.send_type? && param_aliases.include?(child.method_name)
98
- end
103
+ children.each do |child|
104
+ ancestors = child.ancestors.select do |ancestor|
105
+ ancestor.send_type? && ancestor.method?(:permit)
106
+ end
99
107
 
100
- children.each do |child|
101
- ancestors = child.ancestors.select do |ancestor|
102
- ancestor.send_type? && ancestor.method?(:permit)
108
+ ancestors.each do |ancestor|
109
+ parameter_names += params_from_arguments(ancestor.arguments)
110
+ end
103
111
  end
104
112
 
105
- ancestors.each do |ancestor|
106
- parameter_names += params_from_arguments(ancestor.arguments)
107
- end
113
+ parameter_names.map(&:to_sym)
108
114
  end
109
-
110
- parameter_names.map(&:to_sym)
111
115
  end
112
116
  end
113
117
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module Betterment
4
6
  class VagueSerialize < Base
5
7
  MSG = 'Active Record models with serialized columns should specify which ' \
6
- 'deserializer to use instead of falling back to the default.'.freeze
8
+ 'deserializer to use instead of falling back to the default.'
7
9
 
8
10
  # @!method serialize?(node)
9
11
  def_node_matcher :serialize?, <<-PATTERN
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubocop'
2
4
  require 'rubocop/cop/betterment/utils/parser'
3
5
  require 'rubocop/cop/betterment/utils/method_return_table'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: betterlint
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.9
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Development
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-08 00:00:00.000000000 Z
11
+ date: 2023-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -122,14 +122,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
- version: '2.7'
125
+ version: '3.0'
126
126
  required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - ">="
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0'
131
131
  requirements: []
132
- rubygems_version: 3.2.32
132
+ rubygems_version: 3.4.20
133
133
  signing_key:
134
134
  specification_version: 4
135
135
  summary: Betterment rubocop configuration