betterlint 1.25.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 04c560ef56ed92b4393449c238d64d433b16caa1db01dbcb81c647c04f9931d6
4
- data.tar.gz: bac5e05a6ec457e6c047eba8c1d709549167ceae3b408fa084c5aa83c9594676
3
+ metadata.gz: 6bd1ad5be3babcc02d2b5c8f481e9106bf90d575849e9f309d44b137298b1ab0
4
+ data.tar.gz: d999b55f53b8528b169110f2257b1b0cb0127629b50ecdfcc5a59250cb9f79c3
5
5
  SHA512:
6
- metadata.gz: 57bf6d2446f5ec19e463e3bad15bb22934b08104a7614f08b1f67291bd8243ef7c1fdbccd7d8259f8b7b69c10f995248561c2e2cecf032c2bac01df2fd074aba
7
- data.tar.gz: f2cee92d7b16ba483562f7bb1ebf822ff186e106cbf1df9f3f026f013f801a2f4f9fb01737e50b3e8bbfe83f4ee26af1b44614e35a48cf65028e7d3f6afb1dd2
6
+ metadata.gz: af695c343d0618c7d0ac9bc937a67e99fdc5732e6d507bf8efb6a11d1d4981c437dd3118881bd09e504a3427de8e44a852cc7790502767022671de9c2fa88bfa
7
+ data.tar.gz: 56309c5e67dbdd2c4c6a83eb51cf466b2195f5f3deb6ad9b16409e4595b032c2c7aa3140b731a00b325ee5bbcfe14a694ec96b2c3c0d99c53c124059fb680c18
data/README.md CHANGED
@@ -15,9 +15,8 @@ gem 'betterlint'
15
15
  .rubocop.yml:
16
16
 
17
17
  ```yml
18
- inherit_gem:
19
- betterlint:
20
- - config/default.yml
18
+ plugins:
19
+ - betterlint
21
20
  ```
22
21
 
23
22
  ## Dependencies
data/STYLEGUIDE.md CHANGED
@@ -110,6 +110,39 @@ expect(response).to have_http_status :internal_server_error
110
110
  expect(response).to have_http_status 500
111
111
  ```
112
112
 
113
+ ## Betterment/NonNamespacedClass
114
+
115
+ This cop prevents defining classes at the top level without a namespace. All classes should be defined within a module namespace to avoid polluting the global namespace and to better organize code.
116
+
117
+ ### BAD:
118
+
119
+ ```ruby
120
+ class MyClass
121
+ def my_method
122
+ end
123
+ end
124
+ ```
125
+
126
+ ### GOOD:
127
+
128
+ ```ruby
129
+ module MyNamespace
130
+ class MyClass
131
+ def my_method
132
+ end
133
+ end
134
+ end
135
+ ```
136
+
137
+ or using the `::` syntax:
138
+
139
+ ```ruby
140
+ class MyNamespace::MyClass
141
+ def my_method
142
+ end
143
+ end
144
+ ```
145
+
113
146
  ## Betterment/SimpleDelegator
114
147
 
115
148
  This cop requires you to use Rail's `delegate` class method instead of `SimpleDelegator` in order to explicitly specify
data/config/default.yml CHANGED
@@ -2,11 +2,16 @@
2
2
 
3
3
  require:
4
4
  - rubocop/cop/betterment.rb
5
+
6
+ plugins:
7
+ - rubocop-capybara
8
+ - rubocop-factory_bot
5
9
  - rubocop-graphql
6
10
  - rubocop-performance
7
11
  - rubocop-rails
8
12
  - rubocop-rake
9
13
  - rubocop-rspec
14
+ - rubocop-rspec_rails
10
15
 
11
16
  AllCops:
12
17
  DisplayCopNames: true
@@ -42,10 +47,9 @@ Betterment/DynamicParams:
42
47
 
43
48
  Betterment/EnvironmentConfiguration:
44
49
  StyleGuide: '#bettermentenvironmentconfiguration'
45
- Exclude:
46
- - config/**/*.rb
47
- - spec/**/*.rb
48
- - test/**/*.rb
50
+ Include:
51
+ - app/**/*.rb
52
+ - lib/**/*.rb
49
53
 
50
54
  Betterment/HardcodedID:
51
55
  AutoCorrect: false
@@ -58,6 +62,11 @@ Betterment/InternalsProtection:
58
62
  StyleGuide: '#bettermentinternalsprotection'
59
63
  Enabled: false
60
64
 
65
+ Betterment/NonNamespacedClass:
66
+ Description: Detects classes that are not namespaced under a module or constant
67
+ StyleGuide: '#bettermentnonamespacedclass'
68
+ Enabled: false
69
+
61
70
  Betterment/NonStandardActions:
62
71
  AdditionalAllowedActions: []
63
72
  Description: Detects non-standard controller actions.
@@ -254,7 +263,7 @@ Metrics/PerceivedComplexity:
254
263
  Naming/HeredocDelimiterNaming:
255
264
  Enabled: false
256
265
 
257
- Naming/PredicateName:
266
+ Naming/PredicatePrefix:
258
267
  ForbiddenPrefixes:
259
268
  - is_
260
269
  NamePrefix:
@@ -269,9 +278,6 @@ Performance/RedundantMatch:
269
278
  RSpec/BeEq:
270
279
  Enabled: false
271
280
 
272
- RSpec/Capybara/FeatureMethods:
273
- Enabled: false
274
-
275
281
  RSpec/ContextWording:
276
282
  Enabled: false
277
283
 
@@ -303,7 +309,7 @@ RSpec/ExpectChange:
303
309
  EnforcedStyle: block
304
310
 
305
311
  RSpec/SpecFilePathSuffix:
306
- Enabled: false
312
+ Enabled: true
307
313
 
308
314
  RSpec/SpecFilePathFormat:
309
315
  Enabled: false
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Betterlint
4
+ VERSION = '1.27.0'
5
+ end
data/lib/betterlint.rb ADDED
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lint_roller'
4
+ require_relative 'betterlint/version'
5
+
6
+ module Betterlint
7
+ class Plugin < LintRoller::Plugin
8
+ def about
9
+ LintRoller::About.new(
10
+ name: 'betterlint',
11
+ version: VERSION,
12
+ homepage: 'https://github.com/Betterment/betterlint',
13
+ description: 'Shared rubocop configuration for Betterment Rails apps/engines.',
14
+ )
15
+ end
16
+
17
+ def supported?(context)
18
+ context.engine == :rubocop
19
+ end
20
+
21
+ def rules(_context)
22
+ LintRoller::Rules.new(
23
+ type: :path,
24
+ config_format: :rubocop,
25
+ value: File.expand_path('../config/default.yml', __dir__),
26
+ )
27
+ end
28
+ end
29
+ end
@@ -118,7 +118,7 @@ module RuboCop
118
118
  # params[:user_id]
119
119
  # end
120
120
  if ret.send_type? && ret.method?(:[])
121
- internal_params = ret.arguments.select { |x| x.sym_type? || x.str_type? }.map(&:value)
121
+ internal_params = ret.arguments.select { |x| x.type?(:sym, :str) }.map(&:value)
122
122
  else
123
123
  internal_returns = get_method_returns(Utils::Parser.get_root_token(ret))
124
124
  internal_params = internal_returns.flat_map { |x| Utils::Parser.get_extracted_parameters(x, param_aliases: @param_wrappers) }
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Betterment
6
+ class NonNamespacedClass < Base
7
+ MSG = <<~TEXT.gsub(/\s+/, " ").strip
8
+ Do not add new classes that are not namespaced underneath another constant.
9
+ Classes should be defined within a module namespace (e.g., `module MyNamespace; class Foo; end; end`)
10
+ or use the `::` syntax (e.g., `class MyNamespace::Foo`).
11
+ TEXT
12
+
13
+ def on_class(node)
14
+ class_name_node = node.children[0]
15
+
16
+ # Skip if the class name is nil (anonymous class)
17
+ return unless class_name_node
18
+
19
+ if class_name_node.const_type? && !namespaced?(class_name_node) && !inside_namespace?(node)
20
+ add_offense(node)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def namespaced?(node)
27
+ node.children.first&.const_type?
28
+ end
29
+
30
+ def inside_namespace?(node)
31
+ node.each_ancestor(:module, :class).any?
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -52,6 +52,10 @@ module RuboCop
52
52
  route = route_to(node)
53
53
  if route
54
54
  (path, param, value) = route
55
+
56
+ # Newer Rubocop versions return param as an array
57
+ param = param.first if param.is_a?(Array)
58
+
55
59
  action = case param
56
60
  when :to then value.first.split('#').last
57
61
  when :action then value.first
@@ -67,16 +67,16 @@ module RuboCop
67
67
  end
68
68
  end
69
69
 
70
- def self.params_from_arguments(arguments) # rubocop:disable Metrics/PerceivedComplexity
70
+ def self.params_from_arguments(arguments)
71
71
  parameter_names = []
72
72
 
73
73
  arguments.each do |arg|
74
74
  if arg.hash_type?
75
75
  arg.children.each do |pair|
76
76
  value = pair.value
77
- parameter_names << value.value if value.sym_type? || value.str_type?
77
+ parameter_names << value.value if value.type?(:sym, :str)
78
78
  end
79
- elsif arg.sym_type? || arg.str_type?
79
+ elsif arg.type?(:sym, :str)
80
80
  parameter_names << arg.value
81
81
  end
82
82
  end
@@ -92,7 +92,7 @@ module RuboCop
92
92
 
93
93
  if node.method?(:[]) && aliases.include?(get_root_token(node))
94
94
  return node.arguments.select { |x|
95
- x.sym_type? || x.str_type?
95
+ x.type?(:sym, :str)
96
96
  }.map(&:value)
97
97
  end
98
98
 
@@ -12,6 +12,7 @@ require 'rubocop/cop/betterment/hardcoded_id'
12
12
  require 'rubocop/cop/betterment/implicit_redirect_type'
13
13
  require 'rubocop/cop/betterment/internals_protection'
14
14
  require 'rubocop/cop/betterment/memoization_with_arguments'
15
+ require 'rubocop/cop/betterment/non_namespaced_class'
15
16
  require 'rubocop/cop/betterment/non_standard_actions'
16
17
  require 'rubocop/cop/betterment/non_standard_controller'
17
18
  require 'rubocop/cop/betterment/not_using_rswag'
metadata CHANGED
@@ -1,28 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: betterlint
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.25.0
4
+ version: 1.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Development
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-01-27 00:00:00.000000000 Z
11
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lint_roller
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.1'
12
27
  - !ruby/object:Gem::Dependency
13
28
  name: rubocop
14
29
  requirement: !ruby/object:Gem::Requirement
15
30
  requirements:
16
31
  - - "~>"
17
32
  - !ruby/object:Gem::Version
18
- version: '1.71'
33
+ version: '1.82'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.82'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop-capybara
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.22'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.22'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-factory_bot
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.28'
19
62
  type: :runtime
20
63
  prerelease: false
21
64
  version_requirements: !ruby/object:Gem::Requirement
22
65
  requirements:
23
66
  - - "~>"
24
67
  - !ruby/object:Gem::Version
25
- version: '1.71'
68
+ version: '2.28'
26
69
  - !ruby/object:Gem::Dependency
27
70
  name: rubocop-graphql
28
71
  requirement: !ruby/object:Gem::Requirement
@@ -30,6 +73,9 @@ dependencies:
30
73
  - - "~>"
31
74
  - !ruby/object:Gem::Version
32
75
  version: '1.5'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 1.5.6
33
79
  type: :runtime
34
80
  prerelease: false
35
81
  version_requirements: !ruby/object:Gem::Requirement
@@ -37,62 +83,79 @@ dependencies:
37
83
  - - "~>"
38
84
  - !ruby/object:Gem::Version
39
85
  version: '1.5'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.5.6
40
89
  - !ruby/object:Gem::Dependency
41
90
  name: rubocop-performance
42
91
  requirement: !ruby/object:Gem::Requirement
43
92
  requirements:
44
93
  - - "~>"
45
94
  - !ruby/object:Gem::Version
46
- version: '1.23'
95
+ version: '1.26'
47
96
  type: :runtime
48
97
  prerelease: false
49
98
  version_requirements: !ruby/object:Gem::Requirement
50
99
  requirements:
51
100
  - - "~>"
52
101
  - !ruby/object:Gem::Version
53
- version: '1.23'
102
+ version: '1.26'
54
103
  - !ruby/object:Gem::Dependency
55
104
  name: rubocop-rails
56
105
  requirement: !ruby/object:Gem::Requirement
57
106
  requirements:
58
107
  - - "~>"
59
108
  - !ruby/object:Gem::Version
60
- version: '2.29'
109
+ version: '2.34'
61
110
  type: :runtime
62
111
  prerelease: false
63
112
  version_requirements: !ruby/object:Gem::Requirement
64
113
  requirements:
65
114
  - - "~>"
66
115
  - !ruby/object:Gem::Version
67
- version: '2.29'
116
+ version: '2.34'
68
117
  - !ruby/object:Gem::Dependency
69
118
  name: rubocop-rake
70
119
  requirement: !ruby/object:Gem::Requirement
71
120
  requirements:
72
121
  - - "~>"
73
122
  - !ruby/object:Gem::Version
74
- version: '0.6'
123
+ version: '0.7'
75
124
  type: :runtime
76
125
  prerelease: false
77
126
  version_requirements: !ruby/object:Gem::Requirement
78
127
  requirements:
79
128
  - - "~>"
80
129
  - !ruby/object:Gem::Version
81
- version: '0.6'
130
+ version: '0.7'
82
131
  - !ruby/object:Gem::Dependency
83
132
  name: rubocop-rspec
84
133
  requirement: !ruby/object:Gem::Requirement
85
134
  requirements:
86
135
  - - "~>"
87
136
  - !ruby/object:Gem::Version
88
- version: '2.29'
137
+ version: '3.8'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.8'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rubocop-rspec_rails
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '2.32'
89
152
  type: :runtime
90
153
  prerelease: false
91
154
  version_requirements: !ruby/object:Gem::Requirement
92
155
  requirements:
93
156
  - - "~>"
94
157
  - !ruby/object:Gem::Version
95
- version: '2.29'
158
+ version: '2.32'
96
159
  description: Betterment rubocop configuration
97
160
  email:
98
161
  - development@betterment.com
@@ -103,6 +166,8 @@ files:
103
166
  - README.md
104
167
  - STYLEGUIDE.md
105
168
  - config/default.yml
169
+ - lib/betterlint.rb
170
+ - lib/betterlint/version.rb
106
171
  - lib/rubocop/cop/betterment.rb
107
172
  - lib/rubocop/cop/betterment/active_job_performable.rb
108
173
  - lib/rubocop/cop/betterment/allowlist_blocklist.rb
@@ -115,6 +180,7 @@ files:
115
180
  - lib/rubocop/cop/betterment/implicit_redirect_type.rb
116
181
  - lib/rubocop/cop/betterment/internals_protection.rb
117
182
  - lib/rubocop/cop/betterment/memoization_with_arguments.rb
183
+ - lib/rubocop/cop/betterment/non_namespaced_class.rb
118
184
  - lib/rubocop/cop/betterment/non_standard_actions.rb
119
185
  - lib/rubocop/cop/betterment/non_standard_controller.rb
120
186
  - lib/rubocop/cop/betterment/not_using_rswag.rb
@@ -137,11 +203,13 @@ licenses:
137
203
  - MIT
138
204
  metadata:
139
205
  homepage_uri: https://github.com/Betterment/betterlint
140
- source_code_uri: https://github.com/Betterment/betterlint/tree/v1.25.0
141
- changelog_uri: https://github.com/Betterment/betterlint/blob/v1.25.0/CHANGELOG.md
206
+ source_code_uri: https://github.com/Betterment/betterlint/tree/v1.27.0
207
+ changelog_uri: https://github.com/Betterment/betterlint/blob/v1.27.0/CHANGELOG.md
142
208
  bug_tracker_uri: https://github.com/Betterment/betterlint/issues
143
- documentation_uri: https://www.rubydoc.info/gems/betterlint/1.25.0
209
+ documentation_uri: https://www.rubydoc.info/gems/betterlint/1.27.0
144
210
  rubygems_mfa_required: 'true'
211
+ default_lint_roller_plugin: Betterlint::Plugin
212
+ post_install_message:
145
213
  rdoc_options: []
146
214
  require_paths:
147
215
  - lib
@@ -156,7 +224,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
224
  - !ruby/object:Gem::Version
157
225
  version: '0'
158
226
  requirements: []
159
- rubygems_version: 3.6.8
227
+ rubygems_version: 3.4.10
228
+ signing_key:
160
229
  specification_version: 4
161
230
  summary: Betterment rubocop configuration
162
231
  test_files: []